定时器
基本介绍
通用定时器的基本结构组成:STM32的通用定时器,是一个通过可编程预分频器(Prescaler)驱动的16位自动重装主计数器(Counter Period)构成。可以对内部时钟或触发源以及外部时钟或触发源进行计数。
通用定时器的基本工作原理:首先,定时器时钟信号送入16位可编程预分配器(Prescaler),该预分配器系数为0~65535之间的任意数值。预分配器溢出后,会向16位的主计数器(Counter Period)发出一个脉冲信号。预分频器,本质上是一个加法计数器,预分频系数实际上就是加计数的溢出值。
定时器发生中断时间的计算方法:定时时间 = (Prescaler+1 ) X (Counter Period+1) X 1/ 定时器时钟频率时钟信号1KHz,Prescaler为9,Counter Period为999,定时时间
t
=
(
P
+
1
)
(
C
+
1
)
f
t = \frac{(P+1)(C+1)}{f}
t=f(P+1)(C+1)
CubeMX配置
在CubeMX中配置生成1ms定时时间的定时器,配置方法如下图
首先需要配置RCC,只需要修改三个位置即可,HCLK是芯片频率,设置为外部晶振的频率。
配置好RCC之后,就可以配置定时器了,如下图所示
代码编写
在主函数while循环之前添加该语句,使定时器开始
HAL_TIM_Base_Start_IT(&htim2);
编写定时器中断回调函数,或者交中断服务函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
// 定时器2的中断服务程序
}
}
串口
配置
与定时器类似,串口发送和接收也是需要出发中断,因此,除了下图配置之外,还需要使能串口中断。配置不同的串口CubeMX会自动配置相应的IO口。
编程
首先需要声明两个字符串来发送和接收数据
uint8_t TX_BUF[] = "Helloworld\r\n"; uint8_t RX_BUF;
其次在主函数中写非阻塞式的串口收发程序,此处需要注意的是,串口发送函数是写一次发一次,串口接收函数是写一次接收一次,接收完成之后需要再次调用才会再次接收。
HAL_UART_Transmit_IT(&huart1, TX_BUF, sizeof(TX_BUF));
HAL_UART_Receive_IT(&huart1, &RX_BUF, 1);
串口中断的回调函数,当出发数据发送中断或接收中断时运行如下程序
// 串口发送的中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1);
{
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
}
}
// 串口接收的中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if(RX_BUF == 0xa1)
{
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
}
if(RX_BUF == 0xa2)
{
HAL_UART_Transmit_IT(&huart1, TX_BUF, sizeof(TX_BUF));
}
HAL_UART_Receive_IT(&huart1, &RX_BUF, 1);
}
}
串口数据格式化发送,参考如下代码
// 变量定义
/*
uint8_t TX_Torque_data[10];
*/
TX_Torque_data[0] = 'c';
TX_Torque_data[1] = ' ';
TX_Torque_data[2] = '0';
TX_Torque_data[3] = ' ';
TX_Torque_data[4] = '0';
TX_Torque_data[5] = '.';
TX_Torque_data[6] = motor0_torque/10 + '0';
TX_Torque_data[7] = motor0_torque%10 + '0';
TX_Torque_data[8] = '\r';
TX_Torque_data[9] = '\n';
HAL_UART_Transmit_IT(&huart1, TX_Torque_data, sizeof(TX_Torque_data));;
ADC
直接配置引脚位ADC输入,然后使能ADC中断,在中断里读取ADC数据即可。
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADC_Value = HAL_ADC_GetValue(&hadc1);
}
TFTLCD-FSMC
最后
本文仅仅是我个人学习过程中的一些记录和总结,仅供参考。如果对大家有帮助,不妨点个关注