HAL驅動的串列埠程式設計陷阱

2021-09-07 01:30:44 字數 1601 閱讀 9130

手上有塊nucleo stm32l053x板子,用來做串列埠實驗,看了下st的最新庫hal驅動,於是想用hal驅動來做串列埠。

使用過程中發現只能傳送資料不能接收資料,用邏輯分析儀檢視rx,tx引角,都有資料,但就是收不到資料。

使用stm32f103傳統驅動,一點問題沒有,改到hal怎麼就不行了呢?經過一周的除錯終於找到了問題所在.

首先看stm32f103傳通驅動的**:

/*

* usart1 gpio configuration

pa9 ------> usart1_tx

pa10 ------> usart1_rx

*//*configure gpio pin : pa

*/gpio_initstruct.gpio_pin =gpio_pin_9;

gpio_initstruct.gpio_mode =gpio_mode_af_pp;

gpio_initstruct.gpio_speed =gpio_speed_50mhz;

gpio_init(gpioa, &gpio_initstruct);

/*configure gpio pin : pa

*/gpio_initstruct.gpio_pin =gpio_pin_10;

gpio_initstruct.gpio_mode =gpio_mode_in_floating;

gpio_init(gpioa, &gpio_initstruct);

在傳通驅動下我們配置io的時候,

對於tx 我們配置gpio_mode為gpio_mode_af_pp,

對於rx我們配置gpio_mode為gpio_mode_in_floating。

有時候人有慣性思維認為理所應當的在hal裡也應該一樣,我就是在這個地方栽了跟頭。

在hal驅動方式裡,rx,tx 必須都配置成gpio_mode_af_pp。

**如下:用hal驅動時

/*

*usart2 gpio configuration

pa2 ------> usart2_tx

pa3 ------> usart2_rx

*/gpio_initstruct.pin =gpio_pin_2;

gpio_initstruct.mode =gpio_mode_af_pp;

gpio_initstruct.pull =gpio_nopull;

gpio_initstruct.speed =gpio_speed_fast;

gpio_initstruct.alternate =gpio_af4_usart2;

hal_gpio_init(gpioa, &gpio_initstruct);

gpio_initstruct.pin =gpio_pin_3;

//gpio_initstruct.mode = gpio_mode_input;(這句千萬不能要)

gpio_initstruct.alternate =gpio_af4_usart2;

hal_gpio_init(gpioa, &gpio_initstruct);

希望能給後面的人提供點經驗,少走彎路。

串列埠驅動程式設計

在linux系統中,終端是一類字元型裝置,它包括多種型別,通常使用tty來簡稱各種型別的終端裝置。主要包括以下幾種 串列埠終端 dev ttys 串列埠終端是使用計算機串列埠連線的終端裝置。linux把每個串列埠都看作是乙個字元裝置。這些串列埠所對應的裝置名稱是 dev ttysac0 dev tt...

tty串列埠驅動程式設計

在linux系統中,終端是一類字元型裝置,它包括多種型別,通常使用tty來簡稱各種型別的終端裝置。1 串列埠中斷 dev ttys 2 控制台終端 dev console 3 虛擬終端 dev tty 控制台 供核心使用的終端為控制台。控制台在linux啟動時,通過命令console 指定,如果沒有...

常見的程式設計陷阱

原資料來自 1.public class privateoverride public static void main string args class derivedclass extends privateoverride 輸出結果為 private f 分析 private方法被自動認為是...