通過串口設置第一部分大家應該基本會使用單個串口進行收發了
所以本次介紹通過串口進行轉發
【適合情景爲一個串口設備波特率爲38400,但是接收模塊僅支持115200波特率】
一、基本思路
在以上情況下,我們就需要兩個串口和一個存儲位置,在一個串口接收一個信號之後通過MCU轉發到另一個串口以不同的波特率輸出。
二、操作步驟
要求:通過串口向PC發送一段字符
1、根據自己的stm32的芯片型號來選擇,我這裏是STM32F767IGTx
2、選好芯片之後照舊設置RCC爲外部時鐘
3、使能串口1、3(usart1、usart3),如圖:
模式設爲異步(Asynchronous)其他默認,波特率可以自己改,USART1爲115200Bits/s,USART3爲38400Bits/s。
之後再使能串口1、3中斷
4、設置中斷優先級,如圖:
設置中斷優先級
5、看原理圖,找到串口對應引腳,如圖:
我這裏是
PA10——>USART1_RX
PA9——>USART1_TX
PB11——>USART3_RX
PB10——>USART3_TX
6、根據對應引腳設置串口引腳,如圖:
找到PA9、PA10引腳左鍵點擊分別選擇USART1_TX和USART1_RX
(不用擔心選錯選反,針腳的功能是ST公司已經定義好了的)
7、設置時鐘樹,如圖:
這裏會搞的按自己習慣搞,不會搞的默認就好,但是不能有裏面是紅色的框(紅色框就是錯了意思)
8、項目設置,如圖:
紅框裏的按照自己的Keil版本來
個人喜歡把.c/.h文件分開
9、點擊右上角的‘GENERATE CODE’直接生成代碼,如圖:
10、生成代碼後用Keil打開項目並在Application/User中找到usart.c並在/USER CODE BEGIN 0/後添加如下代碼,如圖:
#include <stdio.h>
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART3->ISR&0X40)==0);
USART3->TDR=(uint8_t)ch;
return ch;
}
uint16_t USART3_RX_STA=0;
uint8_t USART3_RX_BUF[800];//串口轉存空間
11、生成代碼後用Keil打開項目並在Application/User中找到main.c:
在/USER CODE BEGIN PV/後添加如下代碼
extern uint8_t USART3_RX_BUF[800];//重申明外部轉存空間
在/* USER CODE BEGIN WHILE */後添加如下代碼
HAL_UART_Receive_IT(&huart3,USART3_RX_BUF,1);
HAL_UART_Transmit(&huart1,USART3_RX_BUF,sizeof(USART3_RX_BUF),100);
\\開啓中斷
在/* USER CODE BEGIN 4 */後添加回調函數
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART3)
{
HAL_UART_Transmit(&huart1,USART3_RX_BUF,1,100);//串口1發送接收buff裏的東西
HAL_UART_Receive_IT(&huart3,USART3_RX_BUF,1); //重新開啓串口3接收中斷
}
}
編譯、下載
三、實驗驗證
正所謂沒有實驗結果的教程都是耍流氓,出結果
目的是USART3接收後通過USART1發送出來,爲了正確表達實驗內容,首先我將USART3的輸入直連在USB,在PC端展示一下USART3的發送內容(這裏用了GPS+BD模塊):
上圖相當於把GPS輸出直連USB,所以打開串口調試助手,波特率設置爲38400Bits/s
改回原樣後重新連接SUART1看情況,USART1的比特率爲115200Bits/s,所以串口調試助手波特率也相應進行修改
可知USART1輸出和USART3接收的數據一致,到此試驗成功。
Good Game!!!!!!
接下來會推出一系列的關於串口使用的分享,有需要的猿們敬請關注!!!!!
以上內容歡迎大家轉載引用,標明出處即可!!!!!