STM32CubeMX基本使用方法

定时器

基本介绍

通用定时器的基本结构组成: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,定时时间

https://img-blog.csdnimg.cn/img_convert/6ad70c772ec364047fa40e8e8ea1e8ba.png#clientId=u936192e5-23be-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u9daeeb4d&margin=[object Object]&originHeight=316&originWidth=1165&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u50a3add9-3062-4a17-8530-8f76c40dacf&title=
t = ( P + 1 ) ( C + 1 ) f t = \frac{(P+1)(C+1)}{f} t=f(P+1)(C+1)

CubeMX配置

在CubeMX中配置生成1ms定时时间的定时器,配置方法如下图
首先需要配置RCC,只需要修改三个位置即可,HCLK是芯片频率,设置为外部晶振的频率。
https://img-blog.csdnimg.cn/img_convert/48ca071def023426490cc19bb00baaae.png#clientId=u936192e5-23be-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u3630c5dc&margin=[object Object]&originHeight=1191&originWidth=1900&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=ud3b5723b-55ab-4567-ac8a-ccb17bddeb2&title=
配置好RCC之后,就可以配置定时器了,如下图所示
在这里插入图片描述
在这里插入图片描述

代码编写

在主函数while循环之前添加该语句,使定时器开始

HAL_TIM_Base_Start_IT(&htim2);

编写定时器中断回调函数,或者交中断服务函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 { 
    if(htim->Instance == TIM2)     
    { 
         // 定时器2的中断服务程序    
    } 
 }

串口

配置

与定时器类似,串口发送和接收也是需要出发中断,因此,除了下图配置之外,还需要使能串口中断。配置不同的串口CubeMX会自动配置相应的IO口。
https://img-blog.csdnimg.cn/img_convert/d4e2b753999bb6d6441052119f595267.png#clientId=u936192e5-23be-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=uc91ef77e&margin=[object Object]&originHeight=1191&originWidth=1900&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u9c708421-a0c2-4724-a30c-079ea1b944c&title=

编程

首先需要声明两个字符串来发送和接收数据

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后

本文仅仅是我个人学习过程中的一些记录和总结,仅供参考。如果对大家有帮助,不妨点个关注

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值