零死角玩轉STM32

一、基礎知識

1、STM32介紹

STM32是由ST公司推出的一款基於ARM Cortex-M內核的單片機,具有高性能、低功耗、高性價比等優點,被廣泛應用於工控、汽車電子、醫療等領域。

2、GPIO

GPIO是通用輸入輸出控制器,是STM32最基本的外設之一,可以用來控制外圍設備的狀態,如LED燈、按鍵等。

3、中斷

中斷是一種處理器對外界事件的響應機制,STM32支持多種中斷模式,應用廣泛,如外部中斷、定時器中斷、DMA中斷等。

二、環境搭建

1、開發環境準備

在進行STM32開發之前,需要搭建開發環境,包括安裝Keil MDK和STM32CubeMX等工具。


#include "stm32f4xx.h"
int main(void)
{
  //代碼內容
}

2、Keil項目配置

在Keil中配置項目,包括選擇芯片型號、添加源文件等。


#include "stm32f4xx.h"
int main(void)
{
  //代碼內容
}

3、STM32CubeMX使用

STM32CubeMX是一款用於配置和生成STM32代碼的工具,可以快速生成基本代碼框架,方便開發者快速上手。


#include "stm32f4xx.h"
int main(void)
{
  //代碼內容
}

三、GPIO控制

1、STM32 GPIO簡介

STM32的GPIO口分為多組,每組有多個引腳,每個引腳可以進行輸入輸出控制。

2、GPIO控制原理

通過設置GPIO配置寄存器的不同位可以控制GPIO的工作模式和輸出狀態,如下面的代碼:


#include "stm32f4xx.h"
int main(void)
{
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA時鐘
  
  GPIO_InitTypeDef GPIO_InitStructure;  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//設置GPIOA0口  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//設置輸出模式  
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//設置輸出速率  
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0口
  
  while(1)
  {  
    GPIO_SetBits(GPIOA, GPIO_Pin_0);//GPIOA0置高  
    delay(500);  
    GPIO_ResetBits(GPIOA,GPIO_Pin_0);//GPIOA0置低  
    delay(500);  
  }  
}

四、外部中斷

1、外部中斷簡介

STM32支持外部中斷,可以通過配置某個引腳為中斷輸入模式來監聽外部事件,如按鍵按下等。

2、外部中斷實現

下面是一個通過配置GPIOA0為中斷輸入模式並實現按鍵轉換的例子:


#include "stm32f4xx.h"  
GPIO_InitTypeDef GPIO_InitStructure;  
NVIC_InitTypeDef NVIC_InitStructure;  
EXTI_InitTypeDef EXTI_InitStructure;  
#define KEY1_GPIO_PORT    GPIOA  
#define KEY1_GPIO_CLK     RCC_AHB1Periph_GPIOA  
#define KEY1_GPIO_PIN     GPIO_Pin_0  
#define KEY1_EXTI_PORTSRC EXTI_PortSourceGPIOA  
#define KEY1_EXTI_PINSRC  EXTI_PinSource0  
#define KEY1_EXTI_LINE    EXTI_Line0  
#define KEY1_EXTI_IRQ     EXTI0_IRQn  
void KEY1_Init(void)  
{  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  
    RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);  
    GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN ;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  
    GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);  
    EXTI_InitStructure.EXTI_Line = KEY1_EXTI_LINE;  
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt ;  
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;   
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
    EXTI_Init(&EXTI_InitStructure);  
    NVIC_InitStructure.NVIC_IRQChannel = KEY1_EXTI_IRQ;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
    NVIC_Init(&NVIC_InitStructure);  
}  
void EXTI0_IRQHandler(void)  
{  
    if(EXTI_GetITStatus(KEY1_EXTI_LINE) != RESET)  
    {  
        //執行中斷處理函數  
        EXTI_ClearITPendingBit(KEY1_EXTI_LINE);  
    }  
}  
int main(void)  
{  
    KEY1_Init();  
    while (1)  
    {  
        //其他代碼  
    }  
}  

五、定時器

1、定時器介紹

定時器是STM32中比較常用的模塊之一,可以用來產生各種時序信號,如PWM波、脈衝信號等。

2、定時器配置

下面是一個使用TIM3定時器產生PWM波的例子:


#include "stm32f4xx.h"  
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;  
TIM_OCInitTypeDef TIM_OCInitStructure;  
GPIO_InitTypeDef GPIO_InitStructure;  
void TIM3_PWM_Init(u16 arr,u16 psc)  
{  
    uint16_t CCR1_Val = 32768;  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);  
      
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  
    GPIO_Init(GPIOC, &GPIO_InitStructure);  
      
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);  
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);  
      
    TIM_TimeBaseInitStructure.TIM_Period = arr;  
    TIM_TimeBaseInitStructure.TIM_Prescaler =psc;  
    TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;  
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);  
      
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
    TIM_OCInitStructure.TIM_Pulse = CCR1_Val;  
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
      
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  
      
    TIM_CtrlPWMOutputs(TIM3, ENABLE);  
    TIM_Cmd(TIM3, ENABLE);  
}  
int main(void)  
{  
    TIM3_PWM_Init(999,83);  
    while (1)  
    {  
        //其他代碼  
    }  
}  

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/246469.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:15
下一篇 2024-12-12 13:15

相關推薦

發表回復

登錄後才能評論