STM32串口USART用法的进阶(HAL库版本)

基础发送:

uint8_t ch=0xAb;//1

uint8_t aRxBuffer[]="hello GKoSon\r\n";//2


HAL_UART_Transmit(&huart1, (uint8_t *)&ch,       1, 0xFFFF);//3

HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);//4


此后不再讨论发送,毕竟这个不是重难点,接受才是。


基础接受:

//HAL_UART_Transmit(&huart1, (uint8_t *)&ch,       1, 0xFFFF);//可以发也可以不发
//HAL_UART_Transmit_IT(&huart1, (uint8_t *)aRxBuffer, sizeof(aRxBuffer));//可以发也可以不发
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);//必须有这句话,貌似用了里面的代码,使能了中断!

重写接受函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{
    HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);

}

此时问题:1只能接受一次,以后中断不来了。2必须接受10个数才能进中断

优化如下:1每次接收以后再次开启接收中断,这样下次还可以进来啦 2修改为1个数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
          HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer,       1,0xFFFF);
          HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer,     1);
}


DMA版本:

#define RECEIVELEN 100
uint8_t usartDMA_rxBuf[RECEIVELEN]; 

HAL_UART_Receive_DMA(&huart1, usartDMA_rxBuf, RECEIVELEN);  /*使能DMA接收*/

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);  /*使能串口空闲中断*/

现在上电就没有提示了,可以自己写个发送玩玩

第一句话是绑定DMA,来源数USART1,目的是数组,定义好的。

第二句是打开空闲中断

it.c里面找到

void USART1_IRQHandler(void)

{

 UsartReceive_IDLE(&huart1);//自己添加一个函数,这就是中断,搬完以后,空闲中断 自己完成它

  HAL_UART_IRQHandler(&huart1);
}

void UsartReceive_IDLE(UART_HandleTypeDef *huart)  
{  
    uint32_t temp;  


    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  
    {   
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);  
        HAL_UART_DMAStop(&huart1);  
        temp = huart1.hdmarx->Instance->CNDTR;  
        rx_len =  RECEIVELEN - temp;    
        HAL_UART_Receive_DMA(&huart1,usartDMA_rxBuf,RECEIVELEN); 


HAL_UART_Transmit(&huart1, (uint8_t *)usartDMA_rxBuf, 10,0xFFFF);//4 收到就发挥了了
    }  

}


代码:https://pan.baidu.com/s/1Lon6RrSZH0NagypjbAeQRw

BBS的比较复杂,接收发送都是DMA

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103RCT6是ST公司推出的一款32位MCU,内部集成了多种外设模块,包括USART串口USART串口是一种全双工的通信方式,可以同时进行收发数据。HAL库STM32的官方硬件抽象层库,提供了丰富的API函数,使得用户可以方便地使用STM32的各种外设模块。 关于STM32F103RCT6的USART3串口HAL库使用,以下是基本的步骤: 1. 配置GPIO引脚,将USART3的TX和RX引脚分别连接到对应的外设引脚上。 2. 初始化USART3外设,包括波特率、数据位、停止位、校验位等参数的设置。 3. 使用HAL库提供的API函数进行数据收发,例如HAL_UART_Transmit()和HAL_UART_Receive()函数。 下面是一个简单的示例代码,演示如何使用USART3串口HAL库进行数据发送和接收: ``` #include "stm32f1xx_hal.h" UART_HandleTypeDef huart3; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART3_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART3_UART_Init(); uint8_t tx_data[] = "Hello, world!"; uint8_t rx_data[100]; HAL_UART_Transmit(&huart3, tx_data, sizeof(tx_data), HAL_MAX_DELAY); HAL_UART_Receive(&huart3, rx_data, sizeof(rx_data), HAL_MAX_DELAY); while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } static void MX_USART3_UART_Init(void) { huart3.Instance = USART3; huart3.Init.BaudRate = 115200; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart3) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void _Error_Handler(char *file, int line) { while(1) {} } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值