基本定时器中断实验
现象:LED0用来指示程序运行,200ms变更一次状态,LED11用于定时器终端取反,指示定时器被中断状态,500ms变更一次状态
LED0快闪,LED1慢闪
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/TIMER/btim.h"
int main(void)
{
HAL_Init(); /* ³õʼ»¯HAL¿â */
sys_stm32_clock_init(RCC_PLL_MUL9); /* ÉèÖÃʱÖÓ, 72Mhz */
delay_init(72); /* ÑÓʱ³õʼ»¯ */
usart_init(115200); /* ´®¿Ú³õʼ»¯Îª115200 */
led_init(); /* ³õʼ»¯LED */
btim_timx_int_init(5000 - 1, 7200 - 1); /* 10KhzµÄ¼ÆÊýƵÂÊ£¬¼ÆÊý5K´ÎΪ500ms */
while (1)
{
LED0_TOGGLE();
delay_ms(200);
}
btim.c(定时器驱动代码)
#include "./BSP/LED/led.h"
#include "./BSP/TIMER/btim.h"
TIM_HandleTypeDef g_timx_handle; /* ¶¨Ê±Æ÷¾ä±ú */
/**
* @brief »ù±¾¶¨Ê±Æ÷TIMX¶¨Ê±Öжϳõʼ»¯º¯Êý
* @note
* »ù±¾¶¨Ê±Æ÷µÄʱÖÓÀ´×ÔAPB1,µ±PPRE1 ¡Ý 2·ÖƵµÄʱºò
* »ù±¾¶¨Ê±Æ÷µÄʱÖÓΪAPB1ʱÖÓµÄ2±¶, ¶øAPB1Ϊ36M, ËùÒÔ¶¨Ê±Æ÷ʱÖÓ = 72Mhz
* ¶¨Ê±Æ÷Òç³öʱ¼ä¼ÆËã·½·¨: Tout = ((arr + 1) * (psc + 1)) / Ft us.
* Ft=¶¨Ê±Æ÷¹¤×÷ƵÂÊ,µ¥Î»:Mhz
*
* @param arr: ×Ô¶¯ÖØ×°Öµ¡£
* @param psc: ʱÖÓÔ¤·ÖƵÊý
* @retval ÎÞ
*/
void btim_timx_int_init(uint16_t arr, uint16_t psc)
{
g_timx_handle.Instance = BTIM_TIMX_INT; /* ͨÓö¨Ê±Æ÷X */
g_timx_handle.Init.Prescaler = psc; /* ÉèÖÃÔ¤·ÖƵϵÊý */
g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* µÝÔö¼ÆÊýģʽ */
g_timx_handle.Init.Period = arr; /* ×Ô¶¯×°ÔØÖµ */
HAL_TIM_Base_Init(&g_timx_handle);
HAL_TIM_Base_Start_IT(&g_timx_handle); /* ʹÄܶ¨Ê±Æ÷x¼°Æä¸üÐÂÖÐ¶Ï */
}
/**
* @brief ¶¨Ê±Æ÷µ×²ãÇý¶¯£¬¿ªÆôʱÖÓ£¬ÉèÖÃÖжÏÓÅÏȼ¶
´Ëº¯Êý»á±»HAL_TIM_Base_Init()º¯Êýµ÷ÓÃ
* @param htim:¶¨Ê±Æ÷¾ä±ú
* @retval ÎÞ
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if (htim->Instance == BTIM_TIMX_INT)
{
BTIM_TIMX_INT_CLK_ENABLE(); /* ʹÄÜTIMʱÖÓ */
HAL_NVIC_SetPriority(BTIM_TIMX_INT_IRQn, 1, 3); /* ÇÀÕ¼1£¬×ÓÓÅÏȼ¶3£¬×é2 */
HAL_NVIC_EnableIRQ(BTIM_TIMX_INT_IRQn); /* ¿ªÆôITM3ÖÐ¶Ï */
}
}
/**
* @brief ¶¨Ê±Æ÷TIMXÖжϷþÎñº¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
void BTIM_TIMX_INT_IRQHandler(void)
{
HAL_TIM_IRQHandler(&g_timx_handle); /* ¶¨Ê±Æ÷ÖжϹ«¹²´¦Àíº¯Êý */
}
/**
* @brief ¶¨Ê±Æ÷¸üÐÂÖжϻص÷º¯Êý
* @param htim:¶¨Ê±Æ÷¾ä±ú
* @retval ÎÞ
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == BTIM_TIMX_INT)
{
LED1_TOGGLE(); /* LED1·´×ª */
}
}