STM32
直播中

李秀兰

7年用户 1410经验值
私信 关注
[问答]

串口与外部中断一般配置步骤有哪些

串口操作相关库函数是什么?
串口配置的一般步骤有哪些?
外部中断常用的库函数是什么?
外部中断的一般配置步骤有哪些?

回帖(1)

张文琳

2021-8-19 10:23:42
  串口:
  串口操作相关库函数(省略入口参数):
  void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
  void USART_Cmd();//使能串口
  void USART_ITConfig();//使能相关中断
  void USART_SendData();//发送数据到串口,DR
  uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
  FlagStatus USART_GetFlagStatus();//获取状态标志位
  void USART_ClearFlag();//清除状态标志位
  ITStatus USART_GetITStatus();//获取中断状态标志位
  void USART_ClearITPendingBit();//清除中断状态标志位
  串口配置的一般步骤:
  ① 串口时钟使能:RCC_APBxPeriphClockCmd();
  GPIO时钟使能:RCC_AHB1PeriphClockCmd();
  ② 引脚复用映射:
  GPIO_PinAFConfig();
  ③GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF
  ④串口参数初始化:USART_Init();
  ⑤开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
  NVIC_Init();
  USART_ITConfig();
  ⑥使能串口:USART_Cmd();
  ⑦编写中断处理函数:USARTx_IRQHandler();
  ⑧串口数据收发:
  voidUSART_SendData();//发送数据到串口,DR
  uint16_tUSART_ReceiveData();//接受数据,从DR读取接受到的数据
  ⑨串口传输状态获取:
  FlagStatusUSART_GetFlagStatus();
  voidUSART_ClearITPendingBit();
  外部中断:
  中断服务函数列表:
  EXTI0_IRQHandler
  EXTI1_IRQHandler
  EXTI2_IRQHandler
  EXTI3_IRQHandler
  EXTI4_IRQHandler
  EXTI9_5_IRQHandler
  EXTI15_10_IRQHandler
  外部中断常用库函数:
  ① voidSYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex);
  //设置IO口与中断线的映射关系
  如;SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);//区别M3
  ②void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
  //初始化中断线:触发方式等
  ③ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
  //判断中断线中断状态,是否发生
  ④void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
  //清除中断线上的中断标志位
  ⑤RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//使能SYSCFG时钟
  //这个函数非常重要,在使用外部中断的时候一定要先使能SYSCFG时钟
  外部中断的一般配置步骤:
  ① 使能SYSCFG时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
  ② 初始化IO口为输入。GPIO_Init();
  ③ 设置IO口与中断线的映射关系。void SYSCFG_EXTILineConfig();
  ④ 初始化线上中断,设置触发条件等。EXTI_Init();
  ⑤ 配置中断分组(NVIC),并使能中断。NVIC_Init();
  ⑥ 编写中断服务函数。EXTIx_IRQHandler();
  ⑦ 清除中断标志位EXTI_ClearITPendingBit();
  看门狗:
  独立看门狗:
  在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
  无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。
  如果程序异常,就无法正常喂狗,从而系统复位。
  IWDG独立看门狗操作库函数:
  voidIWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
  voidIWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PR
  voidIWDG_SetReload(uint16_t Reload);//设置重装载值:写RLR
  voidIWDG_ReloadCounter(void);//喂狗:写0xAAAA到KR
  voidIWDG_Enable(void);//使能看门狗:写0xCCCC到KR
  FlagStatusIWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新
  独立看门狗操作步骤:、
  ① 取消寄存器写保护:IWDG_WriteAccessCmd();
  ② 设置独立看门狗的预分频系数,确定时钟:IWDG_SetPrescaler();
  ③ 设置看门狗重装载值,确定溢出时间:IWDG_SetReload();
  ④ 使能看门狗IWDG_Enable();
  ⑤ 应用程序喂狗: IWDG_ReloadCounter();
  ⑥ 溢出时间计算: Tout=((4×2^prer) ×rlr)/32 (M4)
  窗口看门狗:
  ` 窗口看门狗工作过程总结:
  STM32F的窗口看门狗中有一个7位的递减计数器T[6:0],它会在出现下述2种情况之一时产生看门狗复位:
  ① 当喂狗的时候如果计数器的值大于某一设定数值W[6:0]时,此设定数值在WWDG_CFR寄存器定义。
  ② 当计数器的数值从0x40减到0x3F时【T6位跳变到0】。
  如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以用于喂狗以避免WWDG复位。
  窗口看门狗配置过程:
  ① 使能看门狗时钟:
  RCC_APB1PeriphClockCmd();
  ② 设置分频系数:
  WWDG_SetPrescaler();
  ③ 设置上窗口值:
  WWDG_SetWindowValue();
  ④ 开启提前唤醒中断并分组(可选):
  WWDG_EnableIT();
  NVIC_Init();
  ⑤ 使能看门狗:
  WWDG_Enable();
  ⑥ 喂狗:
  WWDG_SetCounter();
  ⑦编写中断服务函数
  WWDG_IRQHandler();
举报

更多回帖

发帖
×
20
完善资料,
赚取积分