stm32时钟和通信方式及stm32cubemx 配置usart通信

3 篇文章 0 订阅

实验设备:stm32f103c8t6
实验环境:STM32CubeMX v6.1.1;keil v5

1.时钟和外设

AHBAPB1APB2
Flash 存储器定时器TIM2到TIM7USART1
DMARTC(Real Time Clock)模数转换器ADC1、ADC2、ADC3
复位和时钟控制WDT看门狗高级控制定时器TIM1和TIM8
CRCSPI2 、SPI3SPI1
以太网USART2、USART3外部中断EXTI
SDIOUART4、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库

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值