stm32f429学习记录

1.串口uart包含三个知识点:
(1)物理层(电气层:接口决定
(2)数据格式(数据层:芯片决定)
(3)通信协议(协议层:程序决定,)


**HAL库中中断调用流程大体相似:启动文件中定义了中断向量表,包含了各个中断服务函数,然后中断服务函数中调用hal中断函数,然后hal中断函数再调用相关的回调函数,也就是用户需要编写的函数。
除此之外对于外设结构体的定义也有共性。首先是一个XXX_HandleTypeDef的类型,可以定义外设句柄的结构体,其包含所用外设寄存器的基地址XXX_TypeDef *,然后是初始化结构体 _InitTypeDef ,还有_LockTypeDef LOCK,和__IO HAL_IWDG_StateTypeDef State这两个几乎每个句柄结构体都有,还有其他各自的成员
掌握了这两点对于hal库的学习会很有帮助。**

2.串口中断(接受)调用过程:
stm32f429学习记录

经过上面6个步骤,我们就可以写完整的串口接收实验。我们就可以在中断服务函数中编写中断处理过程。
HAL库提供了详细的中断处理函数HAL_UART_IRQHandler
我们在中断服务函数中会调用此函数处理中断。
stm32f429学习记录
stm32f429学习记录

总结:
(1)串口中断服务函数USARTx_IRQHandler中调用HAL库串口中断通用处理函数:
HAL_UART_IRQHandler();
该函数会对中断来源进行分析,调用相应函数,如接受,发送等函数。
(2)而此函数最终会调用相应的回调函数,也就是需要我们真正编写的中断函数。

3.外部中断函数调用过程:
stm32f429学习记录
和串口中断 流程相似:
void EXTI0_IRQHandler(void) //中断服务函数,在启动文件,中断向量表定义
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);//调用中断处理公用函数
}
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);//回调函数
}
}

4.独立看门狗

所谓看门狗就是单片机内部检测程序是否正常运行的模块或者芯片,一般是一个带计数器的模块,它一直倒计数固定时间(时间由频率和重载值决定),在计数到零之前要喂狗(即给寄存器写固定值),否则会产生复位,使程序重新运行。

操作步骤:
(1)初始化看门狗:预分频系数,重装载值。
HAL_IWDG_Init();
该函数在操作PR和RLR寄存器之前会取消
写保护。
(2)启动看门狗
HAL_IWDG_Start();
(3) 喂狗:
HAL_IWDG_Refresh();

5.窗口看门狗

之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。

为什么要窗口看门狗?
对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了;
如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况

5.通用定时器

1.定时中断功能
① 初始化定时器,配置ARR,PSC。
HAL_TIM_Base_Init();
② 使能定时器时钟。
__HAL_RCC_TIM3_CLK_ENABLE();
③ 开启定时器/中断。
HAL_TIM_Base_Start();
HAL_TIM_Base_Start_IT();//使能定时器中断并开启更新中断。
④ 设置中断优先级。
HAL_NVIC_SetPriority(); HAL_NVIC_EnableIRQ();
⑤ 编写中断服务函数。
TIMx_IRQHandler();//中断服务函数
HAL_TIM_IRQHandler();//中断处理入口函数
HAL_TIM_PeriodElapsedCallback();//定时器更新中断回调函数

Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk

在规范的写法中应该在MSPInit和callback中判断是哪个具体的外设,因为这些外设是公用这两个函数的
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
__HAL_RCC_TIM3_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM3_IRQn,1,3);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
}
}

void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
LED1=!LED1;
}
}