參考原子的stm32f1系列的串列埠通訊實驗,移植到stm32l1系列的程式**。
1、採用串列埠中斷方式,串列埠接收到訊息產生中斷,因此需要使能rxne暫存器。hal庫函式的呼叫方式是__hal_uart_enable_it(&uarthandle1, uart_it_rxne);
uarthandle1是uart_handletypedef型別,具體參考stm32lxx_hal_uart.h檔案。
2、關於串列埠初始化,由於hal庫中的串列埠初始化函式hal_uart_init();會呼叫hal_uart_mspinit();後者是乙個關於串列埠1和串列埠2的i/o埠模式選擇及初始化的函式。
為了使程式能順利進入中斷,可在mspinit()函式或者hal_uart_init()函式中使能串列埠並在這裡設定優先順序,hal_nvic_setpriority(usart1_irqn,0,1);
hal_nvic_enableirq(usart1_irqn);
3、編寫串列埠中斷函式。採用乙個unsigned char型別陣列作為串列埠快取,乙個unsigned short int 作為串列埠接收快取區的指標。
需要注意的是發生了中斷必須要清除中斷標誌,否則程式將一直處於該中斷。但是從參考手冊可以得知,在中斷中對資料暫存器進行一次讀操作,即可清除rxne暫存器的標誌位,所以,在中斷裡讀取並且儲存dr暫存器中的內容是乙個很好的選擇。
4、部分**
1.串列埠初始化
bool initserial(uint32_t baudrate)
__hal_uart_enable_it(&uarthandle1, uart_it_rxne);
return true;
}
2. mspinit
void hal_uart_mspinit(uart_handletypedef *huart)
3.中斷程式
void usart1_irqhandler(void)
else
}} }
}
4.主函式測試**
print("usart1_test: usart1_sta=%d\r\n",usart1_sta);
while(1)
else
}hal_delay(10);
}
串列埠間通訊方法(示例:串列埠1傳送給串列埠2)
void usart1_to_usart2(void)
usart1_sta = 0;
hal_uart_transmit(&uarthandle2,(uint8_t*)rx1_buff,len+1,20);
}}
stm32L151 系統時鐘配置
寫在前面 微控制器型號 stm32l151v8t6 硬體 8mhz有源晶振 目的 開啟外部高速晶振,配置系統時鐘 預設使用hsi 16mhz 其實時鐘的配置一點也不難,只要看懂時鐘樹就好。工程的裡面startup stm32l1xx md.s為啟動檔案,reset handler routine r...
STM32低功耗設計
具體要點為 1 所有io管腳,如果高阻狀態埠是高電平,就設成上拉輸入,如果高阻狀態是低電平,設成下拉輸入,如果高阻是中間狀態,設成模擬輸入。這個很多人都提到過,必須的。作為輸出口就免了,待機你想輸出個什麼東西,一定要輸,硬體上加上下拉就可以了 2 兩個晶振輸入腳要remap成普通io!使用內部晶振。...
STM8L之低功耗
1 stm8l有幾個模式?a.非低功耗模式1個,run mode 執行模式 b.低功耗模式 3個 wait 等待模式 active halt 活躍停機模式 halt 停機模式 2 stm8l低功耗的3個模式有什麼區別?簡單地來說,就是 a.wait 等待模式 時鐘關閉 外設可用。通過中斷 外部中斷 ...