CubeMX配置串口通讯(中断方式和DMA方式)
- 前言
- 一、中断方式
- 1.CubeMX配置
- 2.代码实现
- 3.实验结果
- 二、DMA方式
- 1.CubeMX配置
- 2.代码实现
- 3.实验结果
- 总结
前言
本章继续介绍使用STM32CubeMX对串口进行配置的方法,串口通讯有三种方式:轮询,中断和DMA,上一章节实现了重载printf功能和串口轮询接收功能,本章介绍中断和DMA方式,上一章节已经对串口进行了介绍,附有连接和烧录等过程,因此本章仅仅介绍CubeMX配置的方法,代码实现和实验结果。
一、中断方式
1.CubeMX配置
选择芯片stm32f103c6t6,新建工程
设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。
配置时钟树,这里使用官方推荐的配置
stm32f103c6t6中有2个USART口,全都支持DMA方式,其中一个通讯速率可以达到4.5Mb/s,另个一通讯速录可达2.25Mb/s,都具有CTS和RTS信号引脚。
配置引脚功能,从datasheet中可以PA8-PA11可以USART1的复用引脚,因为我们这里使用异步模式,所以仅仅需要TX和RX两个引脚(即PA9,PA10),这样就可以在PA9管脚得到PWM输出。datasheet截图如下:
前面设置HSE时钟为72MHz;USART1的时钟挂载在APB2上
![
CubeMX配置如下:
USART1的参数配置如下,波特率115200,传输数据长度为8 Bit,奇偶检验无,停止位1.其他参数默认
使能USART1中断
SYS选项卡中Debug选项选择串口(这个选项可以设置,不会有影响)
Code Generator中设置只拷贝使用到的库,分离.c和.h文件
设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。
2.代码实现
main函数如下
/* USER CODE BEGIN 0 */
uint8_t aTxStartMessage[] = "\r\n****Interupt Serical communication ****\r\n";
uint8_t aRxBuffer[20];
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Transmit_IT(&huart1, (uint8_t *)aTxStartMessage, sizeof(aTxStartMessage));
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
为了串口回显,这里重载回调函数HAL_UART_RxCpltCallback,该函数会在接收数据之后调用
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback can be implemented in the user file
*/
HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);
}
/* USER CODE END 4 */
3.实验结果
二、DMA方式
1.CubeMX配置
USART1的参数配置如下,波特率115200,传输数据长度为8 Bit,奇偶检验无,停止位1.其他参数默认
使能USART1中断,串口使用DMA方式必须开启中断,否则程序发送一次数据后,不能判断DMA传输是否完成,串口会一直处于busy状态。
DMA参数配置,发送选择 DMA1 Stream 4通道,方向从存储器到外设,优先级为低。接收选择 DMA1 Stream 5通道,方向从外设到存储器。mode设置可以选择Normal表单次传输,传输一次后终止传输,Circular表示循环传输,传输完成后又重新开始继续传输,不断循环永不停止。此处选择单次传输,Mode为Normal。Data Width:串口数据发送寄存器只能存储8bit,每次发送一个字节,所以数据长度选择Byte。
2.代码实现
main函数如下,每秒串口打印一次:
/* USER CODE BEGIN 0 */
uint8_t aTxMessage[] = "\r\n****DMA Serial communication***\r\n";
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)aTxMessage, sizeof(aTxMessage));
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
3.实验结果
总结
本章承接上一章对串口传输方式的配置,介绍使用STM32CubeMX配置串口中断和DMA两种传输方式方式,这里没有介绍中断和DMA的原理,接下来几章介绍中断原理和DMA原理。