前言
串口通訊是平時(shí)大家進(jìn)行調(diào)試最常用的方法,嵌入式應(yīng)用通常要求一個(gè)簡(jiǎn)單的并且占用系統(tǒng)資源少的方法來(lái)傳輸數(shù)據(jù)。通用異步收發(fā)傳輸器 (UART)即可以滿足這些要求,它能夠靈活地與外部設(shè)備進(jìn)行全雙工數(shù)據(jù)交換,那么本章我們來(lái)了解下,本節(jié)課主要學(xué)習(xí)K210的串口通訊。
一、什么是UART?
串口通訊是指外設(shè)和計(jì)算機(jī)間,通過(guò)數(shù)據(jù)信號(hào)線、地線等,按位(bit)進(jìn)行傳輸數(shù)據(jù)(發(fā)送和接收)的一種通訊方式,一個(gè)字符一個(gè)字符地傳輸,每個(gè)字符一位一位地傳輸,并且傳輸一個(gè)字符時(shí),總是以“起始位”開(kāi)始,以“停止位”結(jié)束,字符之間沒(méi)有固定的時(shí)間間隔要求,但是數(shù)據(jù)是低位在前,高位在后,然后接上奇偶檢驗(yàn)位。
串口支持全雙工通訊,也就是使用一根線發(fā)送數(shù)據(jù)的同時(shí),用另一根線接收數(shù)據(jù)。串口通訊最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn),對(duì)于兩個(gè)通訊的端口,這些參數(shù)是必須設(shè)置為相同的。
也可以參考我的這篇文章STM32開(kāi)發(fā)(7)----CubeMX配置串口通訊(輪詢(xún)方式)
二、K210的UART
Tpye-C接口連接到串口芯片,具有供電和串口傳輸數(shù)據(jù)的功能,下載程序也是通過(guò)串口傳輸數(shù)據(jù)的功能把固件傳輸?shù)終210芯片上的。
Type-C接口是目前主流的數(shù)據(jù)傳輸連接接口,市面上很多智能手機(jī)也是使用Type-C接口給手機(jī)充電和傳輸數(shù)據(jù)。Type-C接口是可以正反插的,不用擔(dān)心反向拿反而插不進(jìn)的問(wèn)題。
通用UART 為UART1、UART2 和UART3,支持異步通信(RS232 和RS485 和IRDA,通信速率可達(dá)到5Mbps。UART 支持CTS 和RTS 信號(hào)的硬件管理以及軟件流控(XON 和XOFF)。3 個(gè)接口均可被DMA 訪問(wèn)或者CPU 直接訪問(wèn)。每次傳輸數(shù)據(jù)為8字節(jié),支持異步時(shí)鐘,可單獨(dú)配置數(shù)據(jù)時(shí)鐘,實(shí)現(xiàn)全雙工模式,保證兩個(gè)時(shí)鐘域中數(shù)據(jù)同步。
uart默認(rèn)為RS232模式,也可以配置為軟件可編程式RS485模式。
K210 Tpye-C接口連接K210的IO4和IO5接口,其中IO4為K210芯片的接收引腳,IO5為K210芯片的發(fā)送引腳。
對(duì)應(yīng)的頭文件 uart.h
為用戶(hù)提供以下接口
? uart_init
? uart_config (0.6.0 后不再支持,請(qǐng)使用 uart_configure)
? uart_configure
? uart_send_data
? uart_send_data_dma
? uart_send_data_dma_irq
? uart_receive_data
? uart_receive_data_dma第 11 章 通用異步收發(fā)傳輸器 (UART) 125
? uart_receive_data_dma_irq
? uart_receive_data_dma_irq
? uart_irq_register
? uart_irq_deregister
? uart_set_work_mode
? uart_set_rede_polarity
? uart_set_rede_enable
? uart_set_tat
? uart_set_det
? uart_debug_init
? uart_handle_data_dma
三、實(shí)驗(yàn)過(guò)程
新建一個(gè)uart的文件夾,在里面新建main.c,以后也都是這樣,我們每一個(gè)實(shí)驗(yàn)放一個(gè)文件夾
#include "fpioa.h"
#include "uart.h"
#include <string.h>
// 硬件IO口,與原理圖對(duì)應(yīng)
#define PIN_UART_USB_RX (4)
#define PIN_UART_USB_TX (5)
/*****************************SOFTWARE-GPIO********************************/
// 軟件GPIO口,與程序?qū)?yīng)
#define UART_USB_NUM UART_DEVICE_3
/*****************************FUNC-GPIO************************************/
// GPIO口的功能,綁定到硬件IO口
#define FUNC_UART_USB_RX (FUNC_UART1_RX + UART_USB_NUM * 2)
#define FUNC_UART_USB_TX (FUNC_UART1_TX + UART_USB_NUM * 2)
/**
* Function hardware_init
* @brief 硬件初始化,綁定GPIO口
* @param[in] void
* @param[out] void
* @retval void
* @par History 無(wú)
*/
void hardware_init(void)
{
// fpioa映射
fpioa_set_function(PIN_UART_USB_RX, FUNC_UART_USB_RX);
fpioa_set_function(PIN_UART_USB_TX, FUNC_UART_USB_TX);
}
/**
* Function main
* @brief 主函數(shù),程序的入口
* @param[in] void
* @param[out] void
* @retval 0
* @par History 無(wú)
*/
int main(void)
{
hardware_init();
// 初始化串口3,設(shè)置波特率為115200
uart_init(UART_USB_NUM);
uart_configure(UART_USB_NUM, 115200, UART_BITWIDTH_8BIT, UART_STOP_1, UART_PARITY_NONE);
/* 開(kāi)機(jī)發(fā)送hello yahboom! */
char *hello = {"hello world!\n"};
uart_send_data(UART_USB_NUM, hello, strlen(hello));
char recv = 0;
while (1)
{
/* 等待串口信息,并通過(guò)串口發(fā)送出去 */
while(uart_receive_data(UART_USB_NUM, &recv, 1))
{
uart_send_data(UART_USB_NUM, &recv, 1);
}
}
return 0;
}
代碼寫(xiě)好后,我們開(kāi)始編譯,注意:如果你編譯過(guò)程中出現(xiàn)錯(cuò)誤,可以先make clean掉之前生成的過(guò)程文件,重新生成
cd build
//注意這里的目標(biāo)文件目錄改成uart,和剛才新建的文件夾名稱(chēng)一致
cmake .. -DPROJ=uart -G "MinGW Makefiles"
make
燒錄
然后來(lái)看看結(jié)果吧
那么還有其他方式進(jìn)行串口輸出調(diào)試嗎?我們習(xí)慣用printf進(jìn)行調(diào)試;這個(gè)系統(tǒng)初始化時(shí)候已經(jīng)幫我們做好了一起來(lái)看看user_entry.c文件
系統(tǒng)在初始化bsp是有已經(jīng)注冊(cè)系統(tǒng)輸出回調(diào)函數(shù),printf 時(shí)會(huì)調(diào)用該函數(shù)。系統(tǒng)默認(rèn)使用 UART3,如果需要修改 UART 則調(diào)用
uartdebuginit 函數(shù),具體請(qǐng)到 uart 章節(jié)查看該函數(shù);
void _init_bsp(int core_id, int number_of_cores)
{
extern int main(int argc, char* argv[]);
extern void __libc_init_array(void);
extern void __libc_fini_array(void);
if (core_id == 0)
{
/* Initialize bss data to 0 */
init_bss();
/* Init UART */
fpioa_set_function(4, FUNC_UART3_RX);
fpioa_set_function(5, FUNC_UART3_TX);
uart_debug_init(UART_DEVICE_3);
/* Init FPIOA */
fpioa_init();
/* Register finalization function */
atexit(__libc_fini_array);
/* Init libc array for C++ */
__libc_init_array();
/* Get reset status */
sysctl_get_reset_status();
/* Init plic */
plic_init();
/* Enable global interrupt */
sysctl_enable_irq();
}
因此我們直接使用printf之類(lèi)的函數(shù)也是可以的,寫(xiě)個(gè)簡(jiǎn)單的示例如下:
這里注意包含頭文件
#include <bsp.h>
#include <sysctl.h>
int main(void)
{
int data;
printf("Hello world\n");
/* Clear stdin buffer before scanf */
sys_stdin_flush();
scanf("%d", &data);
printf("\nData is %d\n", data);
while(1)
continue;
return 0;
}
代碼編譯
cd build
//注意這里的目標(biāo)文件目錄改成uart,和剛才新建的文件夾名稱(chēng)一致
cmake .. -DPROJ=printf -G "MinGW Makefiles"
make
燒錄
這個(gè)方式是不是更簡(jiǎn)單?以后我們就直接用printf進(jìn)行打印了
總結(jié)
本章介紹了K210 串口通訊的相關(guān)知識(shí)
K210總共有三個(gè),分別是UART1,UART2和UART3;uart默認(rèn)使用RS232模式,可以另外配置成可編程式RS485模式;uart的引腳如果映射到其他硬件引腳上,需要連接其他串口芯片如CH340上才可以顯示數(shù)據(jù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-794198.html
注冊(cè)系統(tǒng)輸出回調(diào)函數(shù),printf 時(shí)會(huì)調(diào)用該函數(shù)。系統(tǒng)默認(rèn)使用 UART3,如果需要修改 UART 則調(diào)用
uartdebuginit 函數(shù),以后我們直接使用printf進(jìn)行調(diào)試即可文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-794198.html
到了這里,關(guān)于AI嵌入式K210項(xiàng)目(5)-串口通訊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!