★ 可以直接複製貼上到 C 語言開發環境中,此程式碼可以直接編譯執行(只要你配置好開發環境與硬體)。
#include "stm32f4xx.h"
int i;
void My_Usart3_Printf(char *string){
while(*string){
/* 傳送訊息至 USART3 */
USART_SendData(USART3, (unsigned short int) *string++);
/* 等待訊息傳送完畢 */
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
}
}
int main(void){
/******** 宣告 USART、GPIO 結構體 ********/
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/******** 啟用 GPIOC、USART3 的 RCC 時鐘 ********/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
/******** 將 PC10、PC11 連接至 USART3 ********/
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3);
/******** 設定 PC10 為 Tx 覆用 ********/
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 使用推挽式輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 使用上拉電阻
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 設置為覆用
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // 設定第 10 腳
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 設定 GPIO 速度為 50 MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); // 套用以上 GPIO 設置,並初始化 GPIOC
/******** 設定 PC11 為 Rx 覆用 ********/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 設置為覆用
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; // 設定第 11 腳
GPIO_Init(GPIOC, &GPIO_InitStructure); // 套用以上 GPIO 設置,並初始化 GPIOC
/******** USART 基本參數設定 ********/
USART_InitStructure.USART_BaudRate = 9600; // 設定 USART 包率 (每秒位元數) 為 9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 設定 USART 傳輸的資料位元為 8
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 設定 USART 停止位元為 1
USART_InitStructure.USART_Parity = USART_Parity_No; // 不使用同位元檢查
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 不使用流量控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 設定 USART 模式為 Rx (接收) 、 Tx (傳送)
USART_Init(USART3, &USART_InitStructure); // 套用以上 USART 設置,並初始化UART3
/******** 啟用 USART3 ********/
USART_Cmd(USART3, ENABLE);
while (1){
My_Usart3_Printf("Hello !!\n"); // 傳送字串至 USART3
for(i=0; i<30000000; i++); // 延遲
}
}
文章標籤
全站熱搜

彥霖您好,您的文章十分簡潔易懂,十分感謝您 想請問STMF4的文章是在STM32F4-Discovery這塊板子開發的嗎? 小妹使用上述板子,使用這個程式顯示出來的結果都是亂碼 不知道除了時脈(HSE調8MHz)之外還有哪邊需要調整的呢? (另外這個程式char My_Usart3_Printf(char *string)會有警告訊息,改成void My_Usart3_Printf(char *string){後就沒有問題了,不知會不會出問題) 以上問題 先感謝您抽空回答了 謝謝
我是使用官方 STM32F4-Discovery 開發的。 char 是我之前在測試時使用的 ,所以 char My_Usart3_Printf(char *string) 可以改成 void (應該說正常也是要用void才對) 。 出現亂碼: 1.檢查外部石英震盪器是否為 8 MHz。如果不是,請將 stm32f10x.h 檔案中的 #define HSE_VALUE ((uint32_t)8000000) 程式碼修改為 #define HSE_VALUE ((uint32_t)16000000) 即可正常顯示。(注意:預設 stm32f10x.h 檔案是唯讀的,所以必須手動將檔案唯讀取消才可修改) 2. 檢查專案是否為 8 MHz 設定 3. 使用我事先做好的工程模板進行開發(都幫你設定好了,所以可以正常輸出,之後你再對照你原先的專案進行除錯):http://lolikitty.pixnet.net/blog/post/167858043
黃彥霖 先生你好 謝謝你的網站,讓我快速進入狀況 我使用的板子是STM32F407軟體是Keil uVision5 我現在在用HC05的藍芽模組想要去控制一個外接的LED亮暗 所以等於說 我現在要用Keil在STM32F4去設定一個TX跟RX分別接上藍芽的RX跟TX 然後再從STM32F4上去找兩個腳位並給LED供電進而控制亮暗 以上是我的想法 想請你判斷是不是正確的?
很高興本網站能夠幫助您 沒錯,以上您的想法是可行的
黃彥霖 先生你好 謝謝你的網站,讓我學到很多 我使用的板子是STM32F429軟體是Keil uVision4 最近我遇到一個問題是我想從板子這邊透過藍芽傳出至APP 但我有點不太知道我要怎樣對這個我所取樣後的數位值轉換 讓他可以透過藍芽傳出 可以麻煩您提示我一下嗎
可不可以拜託你寫一個串列式RGB LED 燈的教學 遇到了很大的問題真的需要幫忙 謝謝
黃彥霖 先生你好 我是前幾天請教你有關於藍芽的問題 在我開始做的時候遇到了一些問題想請教你 以下先附上我的main GPIO_InitTypeDef gpio; //宣告 USART_InitTypeDef USART_InitStructure; //宣告 RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //for RX TX RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //for USART3 gpio.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 ; //LED的正負極 gpio.GPIO_Speed = GPIO_Speed_50MHz; gpio.GPIO_Mode = GPIO_Mode_OUT; gpio.GPIO_OType = GPIO_OType_PP; gpio.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &gpio); //初始化 //設PB10為Tx gpio.GPIO_Pin = GPIO_Pin_10; gpio.GPIO_OType = GPIO_OType_PP; gpio.GPIO_PuPd = GPIO_PuPd_UP; gpio.GPIO_Mode = GPIO_Mode_AF; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); // 初始化PB10 //設PB11為Rx gpio.GPIO_Pin = GPIO_Pin_11; gpio.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOB, &gpio); // 初始化PB11 USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); //將PB10(pin79)連接USART3 GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); //將 PB11(pni80)連接USART3 GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); USART_Cmd(USART3, ENABLE); //啟用USART3 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART3_IRQn); while (1) { uint16_t i = USART_ReceiveData(USART3); GPIOF->ODR; if(i==1) //i等於1 LED亮 { GPIO_SetBits(GPIOB,GPIO_Pin_1); GPIO_ResetBits(GPIOB,GPIO_Pin_2); Delay(50); } else if(i==2) //i等於2 LED暗 { GPIO_ResetBits(GPIOB,GPIO_Pin_1); GPIO_ResetBits(GPIOB,GPIO_Pin_2); Delay(50); } } 我的問題有 1.手機可以連上藍芽,但用bluetooth這個APP輸入1跟2,LED不會照著我想要的意思去亮暗(只會暗) 2.不確定我輸入的東西是否有跑到STM32F4上 3.有下載AccessPort試試看,但無法偵測到板子,想問有哪邊的參數更變是需要注意的 4.若程式碼有錯誤或是不合邏輯的地方,還請指教 不好意思麻煩黃先生了
黃彥霖 先生你好 我是前幾天請教你有關於藍芽的問題 在我開始做的時候遇到了一些問題想請教你 以下先附上我的main GPIO_InitTypeDef gpio; //宣告 USART_InitTypeDef USART_InitStructure; //宣告 RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //for RX TX RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //for USART3 gpio.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 ; //LED的正負極 gpio.GPIO_Speed = GPIO_Speed_50MHz; gpio.GPIO_Mode = GPIO_Mode_OUT; gpio.GPIO_OType = GPIO_OType_PP; gpio.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &gpio); //初始化 //設PB10為Tx gpio.GPIO_Pin = GPIO_Pin_10; gpio.GPIO_OType = GPIO_OType_PP; gpio.GPIO_PuPd = GPIO_PuPd_UP; gpio.GPIO_Mode = GPIO_Mode_AF; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); // 初始化PB10 //設PB11為Rx gpio.GPIO_Pin = GPIO_Pin_11; gpio.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOB, &gpio); // 初始化PB11 USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); //將PB10(pin79)連接USART3 GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); //將 PB11(pni80)連接USART3 GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); USART_Cmd(USART3, ENABLE); //啟用USART3 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART3_IRQn); while (1) { uint16_t i = USART_ReceiveData(USART3); GPIOF->ODR; if(i==1) //i等於1 LED亮 { GPIO_SetBits(GPIOB,GPIO_Pin_1); GPIO_ResetBits(GPIOB,GPIO_Pin_2); Delay(50); } else if(i==2) //i等於2 LED暗 { GPIO_ResetBits(GPIOB,GPIO_Pin_1); GPIO_ResetBits(GPIOB,GPIO_Pin_2); Delay(50); } } 我的問題有 1.手機可以連上藍芽,但用bluetooth這個APP輸入1跟2,LED不會照著我想要的意思去亮暗(只會暗) 2.不確定我輸入的東西是否有跑到STM32F4上 3.有下載AccessPort試試看,但無法偵測到板子,想問有哪邊的參數更變是需要注意的 4.若程式碼有錯誤或是不合邏輯的地方,還請指教 不好意思麻煩黃先生了
您好, 我使用的板子是STM 32F407, 我們把USB接頭跟板子相連 但是並沒有出現COM port,請問這是正常的嗎? 還是有甚麼設定要調整?