rtthread 串口dma接收_rtthread 添加串口 (uart3)
1.查詢uart配置過程
文件路徑: /drivers/board.h
使能RTT uart驅(qū)動
2.使能usart3總線
打開 /drivers/board.h
#define BSP_UART3_RX_USING_DMA
#define BSP_USING_UART3
#define BSP_UART1_TX_PIN "PB10"
#define BSP_UART1_RX_PIN "PB11"
3.使能HAL庫相應(yīng)模塊
打開 /drivers/ stm32f7xx_hal_conf.h
使能 #define HAL_UART_MODULE_ENABLED
4.添加硬件初始化代碼
通過 stm32cubemx工具使能uart2硬件,在一下路徑
\Core\Src\stm32f7xx_hal_msp.c中將HAL_UART_MspInit拷貝到 /drivers/board.c中
void HAL_UART_MspInit(UART_HandleTypeDef*uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct= {0};if(uartHandle->Instance==USART3)
{/*USART3 clock enable*/__HAL_RCC_USART3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();/**USART3 GPIO Configuration
PB10 ------> USART3_TX
PB11 ------> USART3_RX*/GPIO_InitStruct.Pin=GPIO_PIN_10;
GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_InitStruct.Pin=GPIO_PIN_11;
GPIO_InitStruct.Mode=GPIO_MODE_INPUT;
GPIO_InitStruct.Pull=GPIO_NOPULL;
HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
}
}
5.驗證
6.測試代碼
#include
#define SAMPLE_UART_NAME "uart3"
/*用于接收消息的信號量*/
static structrt_semaphore rx_sem;staticrt_device_t serial;/*接收數(shù)據(jù)回調(diào)函數(shù)*/
staticrt_err_t uart_input(rt_device_t dev, rt_size_t size)
{/*串口接收到數(shù)據(jù)后產(chǎn)生中斷,調(diào)用此回調(diào)函數(shù),然后發(fā)送接收信號量*/rt_sem_release(&rx_sem);returnRT_EOK;
}/**
* 串口接受線程
* @param parameter*/
static void serial_thread_entry(void *parameter)
{charch;while (1)
{/*從串口讀取一個字節(jié)的數(shù)據(jù),沒有讀取到則等待接收信號量*/
while (rt_device_read(serial, -1, &ch, 1) != 1)
{/*阻塞等待接收信號量,等到信號量后再次讀取數(shù)據(jù)*/rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
}/*讀取到的數(shù)據(jù)通過串口錯位輸出*/ch= ch + 1;
rt_device_write(serial,0, &ch, 1);
}
}static int uart_sample(int argc, char *argv[])
{
rt_err_t ret=RT_EOK;charuart_name[RT_NAME_MAX];char str[] = "hello RT-Thread!\r\n";if (argc == 2)
{
rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
}else{
rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
}/*查找系統(tǒng)中的串口設(shè)備*/serial=rt_device_find(uart_name);if (!serial)
{
rt_kprintf("find %s failed!\n", uart_name);returnRT_ERROR;
}/*初始化信號量*/rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);/*以中斷接收及輪詢發(fā)送模式打開串口設(shè)備*/rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);/*設(shè)置接收回調(diào)函數(shù)*/rt_device_set_rx_indicate(serial, uart_input);/*發(fā)送字符串*/rt_device_write(serial,0, str, (sizeof(str) - 1));/*創(chuàng)建 serial 線程*/rt_thread_t thread= rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);/*創(chuàng)建成功則啟動線程*/
if (thread !=RT_NULL)
{
rt_thread_startup(thread);
}else{
ret=RT_ERROR;
}returnret;
}/*導(dǎo)出到 msh 命令列表中*/MSH_CMD_EXPORT(uart_sample, uart device sample);
總結(jié)
以上是生活随笔為你收集整理的rtthread 串口dma接收_rtthread 添加串口 (uart3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab物流配送最优路径,基于Mat
- 下一篇: 华为HCIE