stm32F4系列库函数版本各模块配置过程

Posted xiao-yong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32F4系列库函数版本各模块配置过程相关的知识,希望对你有一定的参考价值。

GPIO配置步骤:

  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟

  //GPIOF9,F10初始化设置

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF9,F10

可以一次初始化一个IO组下的多个IO,前提是这些IO口的配置方式一样。

 

按键配置:

使能按键对应IO口时钟。调用函数:

     RCC_AHB1PeriphClockCmd ();//参照GPIO配置过程

 初始化IO模式:上拉/下拉输入。调用函数:

     GPIO_Init();//和GPIO配置过程一样

扫描IO口电平(库函数/寄存器/位操作)。

u8 KEY_Scan(u8 mode)

    {

     static u8 key_up=1;

     if(mode==1) key_up=1;//支持连续按

      if(key_up &&  KEY按下)

      {

        delay_ms(10);//延时,防抖

        key_up=0;//标记这次key已经按下

        if(KEY确实按下)

          {

           return KEY_VALUE;

          }

        }else if(KEY没有按下)  key_up=1;

       return 没有按下

    }

 

端口复用配置过程:

①GPIO端口时钟使能。

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

②复用外设时钟使能。

     比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟。

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

③端口模式配置为复用功能。 GPIO_Init()函数。

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

④配置GPIOx_AFRL或者GPIOx_AFRH寄存器,将IO连接

    到所需的AFx。

 

     /*PA9连接AF7,复用为USART1_TX */

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);

    /* PA10连接AF7,复用为USART1_RX*/

   GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

 

例子:

      

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟 ①

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟 ②

 

//USART1端口配置③

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉

GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10

//串口1对应引脚复用映射 ④

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1

 

中断优先级配置过程:

系统运行后先设置中断优先级分组。调用函数:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

 整个系统执行过程中,只设置一次中断分组。

针对每个中断,设置对应的抢占优先级和响应优先级:

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

 如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。

 

例子:

typedef struct

{

  uint8_t NVIC_IRQChannel; //设置中断通道

  uint8_t NVIC_IRQChannelPreemptionPriority;//设置响应优先级

  uint8_t NVIC_IRQChannelSubPriority; //设置抢占优先级

  FunctionalState NVIC_IRQChannelCmd; //使能/使能

} NVIC_InitTypeDef;

 

NVIC_InitTypeDef   NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能

NVIC_Init(&NVIC_InitStructure);   //根据上面指定的参数初始化NVIC寄存器

 

 串口配置:

①    串口时钟使能:RCC_APBxPeriphClockCmd();

     GPIO时钟使能:RCC_AHB1PeriphClockCmd();

② 引脚复用映射:

     GPIO_PinAFConfig();

③GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF

④串口参数初始化:USART_Init();

⑤开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)

      NVIC_Init();

      USART_ITConfig();

⑥使能串口:USART_Cmd();

⑦编写中断处理函数:USARTx_IRQHandler();

⑧串口数据收发:

void USART_SendData();//发送数据到串口,DR

uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

⑨串口传输状态获取:

FlagStatus USART_GetFlagStatus();

void USART_ClearITPendingBit();

 

外部中断配置:

使能SYSCFG时钟:

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

初始化IO口为输入。

       GPIO_Init();

设置IO口与中断线的映射关系。

        void SYSCFG_EXTILineConfig();

初始化线上中断,设置触发条件等。

       EXTI_Init();

配置中断分组(NVIC),并使能中断。

       NVIC_Init();

编写中断服务函数。

      EXTIx_IRQHandler();

清除中断标志位

      EXTI_ClearITPendingBit();

 

EXTI_InitStructure.EXTI_Line=EXTI_Line2;   

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

 

待记录。。。

 

以上是关于stm32F4系列库函数版本各模块配置过程的主要内容,如果未能解决你的问题,请参考以下文章

STM32F4系列单片机上使用CUBE配置MBEDTLS实现pem格式公钥导入

STM32F4使用DSP库进行FFT运算的测试过程二

STM32F4HAL库 CubeMX(十五)--------DAC实验

STM32F4时钟配置分析

STM32F4库函数初始化系列:串口DMA接收

STM32F4 HAL库开发 -- 工程模板解读