本文章默认已经添加好了需要的hal库文件,不知道怎么添加的可以去合宙的官网学习,有特别详细的教程,本人实习期间上手两天就独立完成了一个企业小项目,下面分享一下合宙air001这款芯片的定时器中断部分的代码移植(下面展示的是定时器溢出产生的中断)(基于hal库进行移植,也可以自己去合宙的历程中移植)。
main.c文件中代码部分
#include "time.h"
TIM_HandleTypeDef TimHandle;
uint32_t temp;
static void APP_SystemClockConfig(void);
int main(void)
{
/* 初始化所有外设,Flash接口,SysTick */
HAL_Init();
/* 系统时钟配置 */
APP_SystemClockConfig();
/* 初始化LED */
BSP_LED_Init(LED_RED);
TimHandle.Instance = TIM1; /* 选择TIM1 */
TimHandle.Init.Period = 3200 - 1; /* 自动重装载值 */
TimHandle.Init.Prescaler = 10 - 1; /* 预分频为1000-1 */
TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /* 时钟不分频 */
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数 */
TimHandle.Init.RepetitionCounter = 1 - 1; /* 不重复计数 */
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; /* 自动重装载寄存器没有缓冲 */
/* TIM1初始化 */
if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
{
Error_Handler();
}
/* TIM1使能启动,并使能中断 */
if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
{
Error_Handler();
}
while (1)
{
}
}
//中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
}
/**
* @brief 更新中断回调函数
* @param 无
* @retval 无
*/
/**
* @brief 系统时钟配置函数
* @param 无
* @retval 无
*/
static void APP_SystemClockConfig(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/* 振荡器配置 */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE; /* 选择振荡器HSE,HSI,LSI,LSE */
RCC_OscInitStruct.HSIState = RCC_HSI_ON; /* 开启HSI */
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* HSI 1分频 */
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_16MHz; /* 配置HSI时钟16MHz */
RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* 关闭HSE */
/*RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz;*/
RCC_OscInitStruct.LSIState = RCC_LSI_OFF; /* 关闭LSI */
RCC_OscInitStruct.LSEState = RCC_LSE_OFF; /* 关闭LSE */
/*RCC_OscInitStruct.LSEDriver = RCC_LSEDRIVE_MEDIUM;*/
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; /* 开启PLL */
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; /* 选择时钟源为HSI */
/* 配置振荡器 */
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/* 时钟源配置 */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; /* 选择配置时钟 HCLK,SYSCLK,PCLK1 */
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 选择PLL作为系统时钟 */
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB时钟 1分频 */
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB时钟 1分频 */
/* 配置时钟源 */
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief 错误执行函数
* @param 无
* @retval 无
*/
#ifdef USE_FULL_ASSERT
/**
* @brief 输出产生断言错误的源文件名及行号
* @param file:源文件名指针
* @param line:发生断言错误的行号
* @retval 无
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* 用户可以根据需要添加自己的打印信息,
例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* 无限循环 */
while (1)
{
}
}
#endif /* USE_FULL_ASSERT */
air001xx_it.c文件中要加入定时器1的中断服务函数
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TimHandle);
}
air001xx_it.h文件中要声明
void TIM1_BRK_UP_TRG_COM_IRQHandler(void);
air001xx_hal_msp.c文件中要加入一个时钟初始化函数,当时我就是忘记了加这个一直都进不去中断。
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
/* 使能TIM1时钟 */
__HAL_RCC_TIM1_CLK_ENABLE();
/* 设置中断优先级 */
HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0, 0);
/* 使能TIM1中断 */
HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
}
完成以上配置就可使用定时器中断,新手小白,若有错误之处,大家可以批评指正。
我最近建了一个嵌入式的QQ交流群,感兴趣的可以进群了解一下,我会在群里分享一些常用的代码封装,以及一些项目的源码。QQ群讨论也是完全开放,只要不打广告大家可以就嵌入式尽情的沟通和交流,大家对文章中的内容有疑问也可以在群中提出,有空会尽我所能给大家一些帮助。QQ群号:643408467