我來論壇不久,還是很喜歡這里的。遇上這次搞活動,有幸在上周搶到一塊,今天終于到手了,很精致的板子,感謝社區! 板子拿到手馬上開始建工程測試,本來打算下午就發這個帖子的,因為某些原因拖到現在,寫這個帖子也算是對社區一點回饋,都是基礎內容,對初學者有一點幫助。不多說,開始: 拿到一塊開發板,或者新手接觸單片機開發,一般從以下比較簡單的事入手: 首先,點亮一個LED燈,也就是操作GPIO,進而可以做個閃爍,跑馬燈之類的效果 然后的事就沒有順序了,都是基礎,順序隨意: 按鍵的操作,一般有掃面模式和中斷模式 串口通信,USART:發送,接受數據,進而可以用中斷模式,深入一步可以做個DMA傳輸 等等其他內容 1.LED 點亮LED很簡單,就是操作GPIO口,就不詳細說了,查看原理圖,找到對應引腳,配置為推挽輸出,然后將其置高或置低就可以點亮或熄滅LED。Nucleo的板子都很簡單,F303RE這塊只有一個給用戶使用的LED,就是LD2,陽極連接的是PA5引腳 附代碼: - #define LED_GPIO_PORT GPIOA
- #define LED_GPIO_CLK RCC_AHBPeriph_GPIOA
- #define LED2_PIN GPIO_Pin_5
- /******************************************************************/
- #include "LED_Key.h"
- void LED_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- RCC_AHBPeriphClockCmd(LED_GPIO_CLK, ENABLE);
- GPIO_InitStruct.GPIO_Pin =LED2_PIN;
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
- GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
復制代碼
2.USART中斷模式收發
USART,即同步、異步串行通信,這里只用異步方式。使用中斷模式,實現PC串口助手想MCU發送一串數據,MCU將收到的數據發回來。
使用的基本步奏:
1)將開啟引腳相應的時鐘,將所使用的串口對應的引腳配置為復用功能,Nucleo板子上使用的是USART2,PA2,PA3引腳
2)開啟USART時鐘,配置USART2的波特率,數據位,停止位等基本數據
3)配置所使用的中斷并打開中斷
4)打開USART,等待中斷 - #include "USART.h"
- void USART_Config(void)
- {
- USART_InitTypeDef USART_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- NVIC_InitTypeDef NVIC_InitStruct;
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
- GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_2 | GPIO_Pin_3); //USART2對應的RX,TX引腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復用模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- //配置復用功能
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_7);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_7);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
-
- NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
-
- NVIC_Init(&NVIC_InitStruct);
- USART_InitStructure.USART_BaudRate = 115200;
- 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_DeInit(USART2);
- USART_Init(USART2, &USART_InitStructure);
- USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//使能中斷
- USART_ClearFlag (USART2,USART_FLAG_TC);
- USART_Cmd(USART2, ENABLE);
- }
復制代碼- //中斷處理函數
- void USART2_IRQHandler (void)
- {
- if (USART_GetFlagStatus(USART2,USART_FLAG_RXNE) ==SET)
- {
-
- USART_SendData(USART2,USART_ReceiveData(USART2));
-
- while (!USART_GetFlagStatus(USART2,USART_FLAG_TC));
- }
- USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清中斷標志位
- }
復制代碼
發現中斷處理的代碼漏了,補上 Nucleo板子虛擬串口的使用: 板子的ST-LINK提供了虛擬串口功能,只要安裝好驅動就能直接當串口使用,驅動去官網或者社區找。
nucleo用戶手冊(附件)會教你怎么使用,它是用焊接板子上的橋接(SBx)的方法,這里我直接用跳線,這樣反而更加方便靈活,可以連接到任何你想連接的引腳。板子使用的USART2,PA2,PA3引腳,連接如圖所示: 經網友提醒更正下:這塊板子的PA2和PA3引腳其實已經是連接好了的,所以不需要圖中的兩根線,如果要用其他的引腳(PB3,4)才需要連線 (沒錯,就是反過來的,在使用跳線的時候也可以用其他引腳如PB3,PB4,甚至其他串口USART1,3,4,5都可以) 更深入的使用DMA方式發送的就不寫了,需要的參考:USART_DMA方式發送接收
運行效果圖:
3.本來想把按鍵處理的程序也一起發了,不過因為某些原因,時間緊迫,調試的時候出了點問題還沒解決,這里就不寫了, 有需要的可以參考:按鍵掃描/中斷模式 4.工程模板: 自己建的一個可以在SRAM中調試的工程模板,上面的三個例子的程序也都在里面了(按鍵部分注釋掉了),如果懶得自己配置工程的可以拿去用一下,我使用的是MDK5.10,基于標準外設庫,不是HAL庫。工程自帶了外設庫,不是使用編譯器里面的庫,下載直接編譯即可運行。 5.常用文檔:包括STM32F303RE數據手冊+參考手冊+庫函數書名手冊+NucleoF303RE用戶手冊+原理圖 學習開發中遇到的大多數問題都能在這幾份文檔中找到答案,當然這些在社區和官網都有,不過比較分散,既然我整理好了,順便發上來一下。 /*------------------------------------------------我是分割線------------------------------------------------------------------*/ 6.更新一下按鍵的程序(6月4日) 前面提到按鍵中斷的程序有點問題,后來忘了這事一直沒去解決,今天想起來了,把程序改好了并測試通過 程序運行效果:藍色按鍵按下,LED2亮,同時向串口發送“按鍵按下”,按鍵松開,LED2滅,同時向串口發送“按鍵松開”,效果如圖:
代碼:
- void key_interruptmode(void)
- {
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStruct;
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHBPeriphClockCmd(KEY_GPIO_CLK,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
- GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(KEY_GPIO_PORT,&GPIO_InitStructure);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- NVIC_InitStruct.NVIC_IRQChannel =EXTI15_10_IRQn;
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;
- NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
- NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStruct);
-
- SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
- EXTI_ClearITPendingBit(EXTI_Line13);
-
- EXTI_InitStructure.EXTI_Line=EXTI_Line13;
- EXTI_InitStructure.EXTI_LineCmd =ENABLE;
- EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
- EXTI_Init(&EXTI_InitStructure);
- }
- void EXTI15_10_IRQHandler(void)
- {
- if(EXTI_GetITStatus(EXTI_Line13))
- {
- if(GPIO_ReadInputDataBit(KEY_GPIO_PORT,KEY_GPIO_PIN)==RESET) //按鍵按下
- {
- GPIO_SetBits(LED_GPIO_PORT, LED2_PIN);
- printf("按鍵按下...");
- }
- else //按鍵松開
- {
- GPIO_ResetBits(LED_GPIO_PORT, LED2_PIN);
- printf("按鍵松開...");
- }
- }
- EXTI_ClearITPendingBit(EXTI_Line13);
- }
復制代碼
(此部分單獨下載最后一個附件:按鍵中斷程序)
KEY.rar
(1.3 KB, 下載次數: 70)
2016-6-17 15:43 上傳
點擊文件名下載附件
nucleo_64pins_sch.zip
(958.26 KB, 下載次數: 12)
2016-6-17 15:43 上傳
點擊文件名下載附件
NucleoF303_Usermanual.pdf
(1.87 MB, 下載次數: 16)
2016-6-17 15:43 上傳
點擊文件名下載附件
STM32F30xx_Usermanaul.pdf
(8.23 MB, 下載次數: 25)
2016-6-17 15:45 上傳
點擊文件名下載附件
STM32F303RE_Datasheet.pdf
(2.18 MB, 下載次數: 27)
2016-6-17 15:45 上傳
點擊文件名下載附件
STM32F303RE_Reference manual.rar
(5.61 MB, 下載次數: 30)
2016-6-17 15:46 上傳
點擊文件名下載附件
STM32Nucleo_F303RE工程模板.rar
(549.34 KB, 下載次數: 108)
2016-6-17 15:47 上傳
點擊文件名下載附件
應樓下朋友的需要,添加個附件:Nucleo板子虛擬串口ST官方驅動(VCP,用于Win7,8):
stsw-link008.zip
(506.78 KB, 下載次數: 21)
2016-6-17 15:47 上傳
點擊文件名下載附件
|