久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8055|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32F303基礎(chǔ):工程模板+LED+USART+常用文檔+按鍵中斷

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

我來(lái)論壇不久,還是很喜歡這里的。遇上這次搞活動(dòng),有幸在上周搶到一塊,今天終于到手了,很精致的板子,感謝社區(qū)!

板子拿到手馬上開(kāi)始建工程測(cè)試,本來(lái)打算下午就發(fā)這個(gè)帖子的,因?yàn)槟承┰蛲系浆F(xiàn)在,寫這個(gè)帖子也算是對(duì)社區(qū)一點(diǎn)回饋,都是基礎(chǔ)內(nèi)容,對(duì)初學(xué)者有一點(diǎn)幫助。不多說(shuō),開(kāi)始:

拿到一塊開(kāi)發(fā)板,或者新手接觸單片機(jī)開(kāi)發(fā),一般從以下比較簡(jiǎn)單的事入手:

首先,點(diǎn)亮一個(gè)LED燈,也就是操作GPIO,進(jìn)而可以做個(gè)閃爍,跑馬燈之類的效果

然后的事就沒(méi)有順序了,都是基礎(chǔ),順序隨意:

按鍵的操作,一般有掃面模式和中斷模式

串口通信,USART:發(fā)送,接受數(shù)據(jù),進(jìn)而可以用中斷模式,深入一步可以做個(gè)DMA傳輸

等等其他內(nèi)容

1.LED

點(diǎn)亮LED很簡(jiǎn)單,就是操作GPIO口,就不詳細(xì)說(shuō)了,查看原理圖,找到對(duì)應(yīng)引腳,配置為推挽輸出,然后將其置高或置低就可以點(diǎn)亮或熄滅LED。Nucleo的板子都很簡(jiǎn)單,F(xiàn)303RE這塊只有一個(gè)給用戶使用的LED,就是LD2,陽(yáng)極連接的是PA5引腳

附代碼:

  1.     #define LED_GPIO_PORT                        GPIOA
  2.     #define LED_GPIO_CLK                    RCC_AHBPeriph_GPIOA
  3.     #define LED2_PIN                         GPIO_Pin_5
  4.     /******************************************************************/
  5.     #include "LED_Key.h"

  6.     void LED_Init(void)
  7.     {
  8.             GPIO_InitTypeDef GPIO_InitStruct;
  9.             RCC_AHBPeriphClockCmd(LED_GPIO_CLK, ENABLE);

  10.             GPIO_InitStruct.GPIO_Pin =LED2_PIN;
  11.             GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
  12.             GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  13.             GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  14.             GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
復(fù)制代碼

2.USART中斷模式收發(fā)


USART,即同步、異步串行通信,這里只用異步方式。使用中斷模式,實(shí)現(xiàn)PC串口助手想MCU發(fā)送一串?dāng)?shù)據(jù),MCU將收到的數(shù)據(jù)發(fā)回來(lái)。


使用的基本步奏:


1)將開(kāi)啟引腳相應(yīng)的時(shí)鐘,將所使用的串口對(duì)應(yīng)的引腳配置為復(fù)用功能,Nucleo板子上使用的是USART2,PA2,PA3引腳


2)開(kāi)啟USART時(shí)鐘,配置USART2的波特率,數(shù)據(jù)位,停止位等基本數(shù)據(jù)


3)配置所使用的中斷并打開(kāi)中斷



4)打開(kāi)USART,等待中斷

  1.     #include "USART.h"
  2.     void USART_Config(void)
  3.     {
  4.             USART_InitTypeDef USART_InitStructure;
  5.             GPIO_InitTypeDef GPIO_InitStructure;
  6.             NVIC_InitTypeDef NVIC_InitStruct;
  7.             
  8.             RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  9.             RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  10.             GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_2 | GPIO_Pin_3);   //USART2對(duì)應(yīng)的RX,TX引腳
  11.             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;             //復(fù)用模式
  12.             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.             GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;         //推挽輸出
  14.             GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  15.             GPIO_Init(GPIOA, &GPIO_InitStructure);
  16.             //配置復(fù)用功能
  17.             GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_7);
  18.             GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_7);

  19.             NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  20.             
  21.             NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
  22.             NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
  23.             NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
  24.             NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  25.             
  26.             NVIC_Init(&NVIC_InitStruct);

  27.             USART_InitStructure.USART_BaudRate = 115200;
  28.             USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  29.             USART_InitStructure.USART_StopBits = USART_StopBits_1;
  30.             USART_InitStructure.USART_Parity = USART_Parity_No;
  31.             USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  32.             USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  33.             USART_DeInit(USART2);
  34.             USART_Init(USART2, &USART_InitStructure);
  35.             USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//使能中斷
  36.             USART_ClearFlag (USART2,USART_FLAG_TC);
  37.             USART_Cmd(USART2, ENABLE);   
  38.     }
復(fù)制代碼
  1.     //中斷處理函數(shù)
  2.     void USART2_IRQHandler (void)
  3.     {
  4.             if (USART_GetFlagStatus(USART2,USART_FLAG_RXNE) ==SET)
  5.                     {
  6.                            
  7.                             USART_SendData(USART2,USART_ReceiveData(USART2));
  8.                                     
  9.                             while (!USART_GetFlagStatus(USART2,USART_FLAG_TC));
  10.                     }
  11.             USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清中斷標(biāo)志位
  12.     }
復(fù)制代碼


發(fā)現(xiàn)中斷處理的代碼漏了,補(bǔ)上

Nucleo板子虛擬串口的使用:

板子的ST-LINK提供了虛擬串口功能,只要安裝好驅(qū)動(dòng)就能直接當(dāng)串口使用,驅(qū)動(dòng)去官網(wǎng)或者社區(qū)找。


nucleo用戶手冊(cè)(附件)會(huì)教你怎么使用,它是用焊接板子上的橋接(SBx)的方法,這里我直接用跳線,這樣反而更加方便靈活,可以連接到任何你想連接的引腳。板子使用的USART2,PA2,PA3引腳,連接如圖所示:

經(jīng)網(wǎng)友提醒更正下:這塊板子的PA2和PA3引腳其實(shí)已經(jīng)是連接好了的,所以不需要圖中的兩根線,如果要用其他的引腳(PB3,4)才需要連線

(沒(méi)錯(cuò),就是反過(guò)來(lái)的,在使用跳線的時(shí)候也可以用其他引腳如PB3,PB4,甚至其他串口USART1,3,4,5都可以)

更深入的使用DMA方式發(fā)送的就不寫了,需要的參考:USART_DMA方式發(fā)送接收


運(yùn)行效果圖:


3.本來(lái)想把按鍵處理的程序也一起發(fā)了,不過(guò)因?yàn)槟承┰颍瑫r(shí)間緊迫,調(diào)試的時(shí)候出了點(diǎn)問(wèn)題還沒(méi)解決,這里就不寫了,

有需要的可以參考:按鍵掃描/中斷模式

4.工程模板:

自己建的一個(gè)可以在SRAM中調(diào)試的工程模板,上面的三個(gè)例子的程序也都在里面了(按鍵部分注釋掉了),如果懶得自己配置工程的可以拿去用一下,我使用的是MDK5.10,基于標(biāo)準(zhǔn)外設(shè)庫(kù),不是HAL庫(kù)。工程自帶了外設(shè)庫(kù),不是使用編譯器里面的庫(kù),下載直接編譯即可運(yùn)行。

5.常用文檔:包括STM32F303RE數(shù)據(jù)手冊(cè)+參考手冊(cè)+庫(kù)函數(shù)書(shū)名手冊(cè)+NucleoF303RE用戶手冊(cè)+原理圖

學(xué)習(xí)開(kāi)發(fā)中遇到的大多數(shù)問(wèn)題都能在這幾份文檔中找到答案,當(dāng)然這些在社區(qū)和官網(wǎng)都有,不過(guò)比較分散,既然我整理好了,順便發(fā)上來(lái)一下。

/*------------------------------------------------我是分割線------------------------------------------------------------------*/

6.更新一下按鍵的程序(6月4日)

前面提到按鍵中斷的程序有點(diǎn)問(wèn)題,后來(lái)忘了這事一直沒(méi)去解決,今天想起來(lái)了,把程序改好了并測(cè)試通過(guò)

程序運(yùn)行效果:藍(lán)色按鍵按下,LED2亮,同時(shí)向串口發(fā)送“按鍵按下”,按鍵松開(kāi),LED2滅,同時(shí)向串口發(fā)送“按鍵松開(kāi)”,效果如圖:



代碼:


  1.     void key_interruptmode(void)
  2.     {
  3.             EXTI_InitTypeDef                 EXTI_InitStructure;
  4.             NVIC_InitTypeDef                 NVIC_InitStruct;
  5.             GPIO_InitTypeDef            GPIO_InitStructure;

  6.             RCC_AHBPeriphClockCmd(KEY_GPIO_CLK,ENABLE);
  7.             RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

  8.             GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN;
  9.             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  10.             GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  11.             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
  12.             GPIO_Init(KEY_GPIO_PORT,&GPIO_InitStructure);

  13.             NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  14.             NVIC_InitStruct.NVIC_IRQChannel =EXTI15_10_IRQn;
  15.             NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;
  16.             NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
  17.             NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  18.             NVIC_Init(&NVIC_InitStruct);
  19.             
  20.             SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
  21.             EXTI_ClearITPendingBit(EXTI_Line13);
  22.             
  23.             EXTI_InitStructure.EXTI_Line=EXTI_Line13;
  24.             EXTI_InitStructure.EXTI_LineCmd =ENABLE;
  25.             EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  26.             EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
  27.             EXTI_Init(&EXTI_InitStructure);
  28.     }

  29.     void EXTI15_10_IRQHandler(void)
  30.     {

  31.             if(EXTI_GetITStatus(EXTI_Line13))
  32.                     {
  33.                             if(GPIO_ReadInputDataBit(KEY_GPIO_PORT,KEY_GPIO_PIN)==RESET)                                //按鍵按下
  34.                                     {
  35.                                             GPIO_SetBits(LED_GPIO_PORT, LED2_PIN);
  36.                                             printf("按鍵按下...");
  37.                                     }
  38.                             else                                        //按鍵松開(kāi)
  39.                                     {
  40.                                             GPIO_ResetBits(LED_GPIO_PORT, LED2_PIN);
  41.                                             printf("按鍵松開(kāi)...");
  42.                                     }
  43.                     }
  44.             EXTI_ClearITPendingBit(EXTI_Line13);
  45.     }
復(fù)制代碼

(此部分單獨(dú)下載最后一個(gè)附件:按鍵中斷程序)

KEY.rar (1.3 KB, 下載次數(shù): 70)


nucleo_64pins_sch.zip (958.26 KB, 下載次數(shù): 12)


NucleoF303_Usermanual.pdf (1.87 MB, 下載次數(shù): 16)


STM32F30xx_Usermanaul.pdf (8.23 MB, 下載次數(shù): 25)


STM32F303RE_Datasheet.pdf (2.18 MB, 下載次數(shù): 27)


STM32F303RE_Reference manual.rar (5.61 MB, 下載次數(shù): 30)


STM32Nucleo_F303RE工程模板.rar (549.34 KB, 下載次數(shù): 108)

應(yīng)樓下朋友的需要,添加個(gè)附件:Nucleo板子虛擬串口ST官方驅(qū)動(dòng)(VCP,用于Win7,8):

stsw-link008.zip (506.78 KB, 下載次數(shù): 21)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黄色视频a级毛片 | 中文字幕第一页在线 | 亚洲啊v在线 | 操网站| 色视频免费 | 99热精品在线观看 | 自拍第一页 | 欧美日韩三级 | 欧美日韩精品一区二区三区四区 | 国产一区二区三区四区 | 国产日产精品一区二区三区四区 | 91高清视频 | 一级毛片免费看 | 国产精品久久国产愉拍 | 国产精品亚洲视频 | 51ⅴ精品国产91久久久久久 | 午夜影院黄| 国产精品九九视频 | 亚洲视频欧美视频 | 免费在线黄色av | 欧美午夜影院 | jlzzjlzz国产精品久久 | 久久小视频 | 亚洲欧美成人影院 | 日韩欧美在线观看 | 国产日韩欧美中文 | 亚洲成人精品免费 | 国产精品日日做人人爱 | 精品久久1 | 日韩视频一级 | 男人天堂99 | 久草视 | 精品产国自在拍 | www.yw193.com| 久久久美女 | 香蕉视频91 | 天天操天天操 | 国产精品美女久久久久久免费 | 黑色丝袜三级在线播放 | 亚洲第一中文字幕 | 激情一区二区三区 |