stm32时钟和常见通信方式及stm32cubemx 配置
实验设备:stm32f103c8t6
实验环境:STM32CubeMX v6.1.1;keil v5
1.时钟和外设
AHB | APB1 | APB2 |
---|---|---|
Flash 存储器 | 定时器TIM2到TIM7 | USART1 |
DMA | RTC(Real Time Clock) | 模数转换器ADC1、ADC2、ADC3 |
复位和时钟控制 | WDT看门狗 | 高级控制定时器TIM1和TIM8 |
CRC | SPI2 、SPI3 | SPI1 |
以太网 | USART2、USART3 | 外部中断EXTI |
SDIO | UART4、UART5 | 复用IO,AFIO |
- | I2C1,I2C2 | 通用IO:GPIOA~G |
- | USB./CAN共享的512字节SRAM | - |
- | bXCAN1、bXCAN2 | - |
- | 后备寄存器BKP | - |
- | 电源控制PWR | - |
- | DAC | - |
时钟树
STM32CubeMX 的时钟树
时钟树
各类时钟简括 | - |
---|---|
HSE(高速外部时钟) | 来源为外部无源晶振,通常速度8M。(由RCC_CR时钟控制寄存器中的16:HSEON控制。) |
HSI(高速内部时钟) | 来源为芯片内部,大小为8M,当HSE故障时,系统时钟会自动切换到HSI,知道HSE启动成功,相当于HSE的替补。(由RCC_CR时钟控制寄存器的位0:HSION控制)。 |
PLLCLK(锁相环时钟) | 源为HSI/2、HSE经过倍频所得。(由CFGR(时钟配置寄存器)中PLLXTPRE、PLLMUL控制。) |
SYSCLK(系统时钟) | 来源为HSI、HSE、PLLCLK,最高速度为72M。(由CFGR中的SW控制。) |
HCLK(AHB高速总线时钟) | 来源由系统时钟分频得到,速度最高为72M。(由CFGR中的HPRE控制。) |
PCLK1(APB1低总线时钟) | 来源为HCLK分频得到,速度最高为36M ,为APB1总线上的外设提供时钟。(由RCC_CFGR时钟配置寄存器的PPRE1位控制。) |
PCLK2(APB2高总线时钟) | 来源为HCLK分频得到,速度最高为72M,为APB2总线上的外设提供时钟。(由RCC_CFGR时钟配置寄存器的PPRE2位控制。) |
RTC时钟 | 来源为HSE_RTC(HSE分频得到)、LSE、LSI,为芯片内部的RTC外设提供时钟。(由RCC备份域控制寄存器RCC_BDCR中RTCSEL控制。) |
MCO时钟输出 | 来源为PLLCLK/2、HSE、HSI、SYSCLK,微控制器时钟输出引脚,由PA8复用所得。 |
时钟配置步骤
- 1.开启HSE,并等待HSE稳定;
- 2.设置AHB、APB1、APB2的预分频因子;
- 3.设置PLL的时钟来源和倍频因子;
- 4.开启PLL,并等待PLL稳定;
- 5.把PLLCLK切换为系统时钟SYSCLK;
- 6.读取时钟切换状态位,确保PLLCLK被选为系统时钟。
2.串行通信的分类
按照数据传送方向,分为:
- | - |
---|---|
单工 | 数据传输只支持数据在一个方向上传输; |
半双工 | 允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。 |
全双工 | 允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。 |
按照通信方式,分为:
- | - |
---|---|
同步通信 | 带时钟同步信号传输。比如:SPI,IIC通信接口。 |
异步通信 | 不带时钟同步信号。比如:UART(通用异步收发器),单总线。 |
STM32常见通信方式(TTL、RS232、RS485、I2C 、CAN)
1.TTL电平:全双工(逻辑1: 2.4V–5V 逻辑0: 0V–0.5V)
2.RS-232电平:全双工(逻辑1:-15V–5V 逻辑0:+3V–+15V)
3.RS-485:半双工、(逻辑1:+2V–+6V 逻辑0: -6V—2V)这里的电平指AB 两线间的电压差。
4.CAN总线:逻辑1:-1.5V–0V 逻辑0:+1.5V–+3V)这里的电平指CAN_High、CAN_Low 两线间的电压差。
5.I2C
I2C物理层
I2C协议层
数据的起始信号与停止信号
数据有效性
6.SPI
USART通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)
串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。USART就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。
USART满足外部设备对工业标准(NRZ异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。[USART]支持同步单向通信和半双工单线通信;还支持局域互连网络LN、智能卡(SmartCard)协议与IhDA(红外线数据协会)SIR ENDEC规范。
USART支持使用DMA,可实现高速数据通信,USART在 STM32应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。
STM32的UART特点 |
---|
全双工异步通信 |
分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s |
可编程的数据字长度(8位或者9位) |
可配置的停止位(支持1或者2位停止位) |
可配置的使用DMA多缓冲器通信 |
单独的发送器和接收器使能位 |
检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志 |
多个带标志的中断源,触发中断 |
其他:校验控制,四个错误检测标志 |
通信过程
usart功能框图
①功能引脚
②数据寄存器
③控制器
④小数波特率生成
⑤校验控制
⑥中断控制
3.STM32CubeMX 配置USART
在Mode里面
1、Disable 关闭串口
2、Asynchronous 异步模式
3、Synchronous 同步模式
4、Single Wire (Half-Duplex) 单线半双工模式,
5、Multiprocessor Communication 多处理器通信模式
6、IrDA 红外通讯
7、LIN 局域互联网模式
8、SmartCard 智能卡模式
在Parameter Settings 可以设置串口的一些参数:
Baud Rate : 波特率
Word Length : 数据位
Parity : 校验位
Stop Bits : 停止位
Data Direction : 数据方向
Over Sampling : 过样率
发送
/**
* @brief Sends an amount of data in blocking mode.
* @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
* the sent data is handled as a set of u16. In this case, Size must indicate the number
* of u16 provided through pData.
* @param huart Pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @param pData Pointer to data buffer (u8 or u16 data elements).
* @param Size Amount of data elements (u8 or u16) to be sent
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
示例(在主函数中,每隔100ms发送一次"1111")
/**** main.c ****/
/**/
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Transmit(&huart1, (uint8_t *)"1111", 5, 5);
HAL_Delay(100);
}
/* USER CODE END 3 */
printf函数重定向
/**** usart.h ****/
/**/
typedef struct __FILE FILE;
/**** usart.c ****/
/**/
//重映射fputc
int fputc(int ch,FILE *f)
{
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart2, temp, 1, 2);
return ch;
}
使用printf发送
/**** main.c ****/
/**/
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// HAL_UART_Transmit(&huart1, (uint8_t *)"1111", 5, 5);
printf("usart");
HAL_Delay(500);
}
/* USER CODE END 3 */
接收PC的数据并发送回去
串口是如何工作的
一般有两种方式:查询和中断。
- | - |
---|---|
查询 | 串口程序不断地循环查询,看看当前有没有数据要它传送。如果有,就帮助传送(可以从PC到STM32板子,也可以从STM32板子到PC)。 |
中断 | 平时串口只要打开中断即可。如果发现有一个中断来,则意味着要它帮助传输数据——它就马上进行数据的传送。同样,可以从 PC到STM3板子,也可以从STM32板子到PC。 |
HAL库-回调函数-------标准库-中断
普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数
- | - |
---|---|
对普通函数的调用 | 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用–>等待被调用函数执行完毕–>继续执行” |
对回调函数调用 | 调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。 |
使用回调函数来处理串口收到的信息
/**** main.c ****/
/**/
uint8_t Rx_data; //
int main()
{
//......
HAL_UART_Receive_IT(&huart1, &Rx_data, sizeof(temp)); //开启接收中断
//......
}
重新定义回调函数
/**** usart.c ****/
/**/
/**
在main.c文件里定义一个全局变量来保存串口接收到的数据
比如这里的temp
**/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(huart, &Rx_data, sizeof(Rx_data), 5);
HAL_UART_Receive_IT(huart, &Rx_data, sizeof(Rx_data));//重新使能接收中断
}
4.具体用法
请跳转
链接: STM32CubeMX配置使用usart
https://editor.csdn.net/md/?articleId=124071733
5.参考
CSDN博主「Liu-FE」,原文链接:https://blog.csdn.net/qq_45264808/article/details/110423520
CSDN博主「ydgd118」,原文链接:https://blog.csdn.net/ydgd118/article/details/107865409
CSDN博主「未来战争」,原文链接:https://blog.csdn.net/qq_23127707/article/details/108134575
博客园「CodeAllen」,原文链接:https://www.cnblogs.com/CodeAllen/p/11145920.html
知乎「汇编技术大拿」,原文链接:https://zhuanlan.zhihu.com/p/192345025
d118」,原文链接:https://blog.csdn.net/ydgd118/article/details/107865409
CSDN博主「未来战争」,原文链接:https://blog.csdn.net/qq_23127707/article/details/108134575
博客园「CodeAllen」,原文链接:https://www.cnblogs.com/CodeAllen/p/11145920.html
知乎「汇编技术大拿」,原文链接:https://zhuanlan.zhihu.com/p/192345025
CSDN「位文杰TOP」,原文链接:https://blog.csdn.net/qq_36958104/article/details/90897958
ST官方HAL库