日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32嘀!嘀!嘀!点触式发报机

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32嘀!嘀!嘀!点触式发报机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STM32使用按鍵控制串口發送和停止

主要用到三部分的內容,

  • GPIO控制LED燈的亮滅
  • EXTI外部按鍵觸發中斷,在中斷中控制串口的使能
  • USART串口發送數據
  • 一、GPIO控制LED

    首先開啟對應的時鐘,配置GPIO為推挽輸出:

    GPIO_InitTypeDef gpio_s;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD,ENABLE);gpio_s.GPIO_Pin = GPIO_Pin_8;gpio_s.GPIO_Mode = GPIO_Mode_Out_PP;gpio_s.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&gpio_s);

    對于LED的控制放置在EXTI的中斷函數中,實現發送時led燈亮,停止時LED燈滅的效果。

    二、EXTI按鍵外部中斷(要開啟AFIO時鐘)

    在外部中斷中需要做四方面的工作

  • 配置外部中斷的GPIO
  • 配置NVIC
  • 配置EXTI
  • 書寫中斷服務函數
  • 1、配置外部中斷的GPIO

    配置外部中斷的GPIO需要知道我們想要以什么樣的方式觸發中斷,使用下降沿還是上升沿或者是邊沿觸發。在我的實驗中根據電路原理圖來選擇的。

    原理圖可以看出當按鍵被按下是GPIO口被拉低,所以當按鍵沒有按下時需要讓端口保持高電平,因此這里選用上拉輸入。

    GPIO_InitTypeDef gpio_s;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC,ENABLE);gpio_s.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_13;gpio_s.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOC,&gpio_s);

    2、配置NVIC

    說句實話每次搞中斷總是忘記配置這個,所以多搞幾次就記住了。
    配置NVIC的作用就是打開某個中斷并配置中斷的優先級。所以配置的過程需要知道總共有多少個優先級可以配置。這就是下面這行代碼:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    具體這個看下面這個:

    關于搶占優先級和響應優先級,舉個例子:
    有三個分別是A、B、C
    A搶占優先級為0,響應優先級為0
    B搶占優先級為0,響應優先級為1
    C搶占優先級為1,響應優先級為0
    當A\B\C三個中斷同時發生時A最先執行,B次之,C最后。
    在NVIC配置中主要就是配置某個中斷的這兩個優先級,同時開啟某個中斷向量的中斷響應。

    NVIC_InitTypeDef nvic_s;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);nvic_s.NVIC_IRQChannel = EXTI1_IRQn;nvic_s.NVIC_IRQChannelPreemptionPriority = 0;nvic_s.NVIC_IRQChannelSubPriority = 0;nvic_s.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_s);

    3、配置EXTI

    配置EXTI就是配置具體某個外部中斷以及其的觸發方式。
    我們知道GPIOA、GPIOB、GPIOC、GPIOD、GPIOE這幾組GPIO中如PA1,、PB1、PC1、PD1、PE1這幾的中斷是同一個,中斷函數也是同一個,因此在具體配置EXTI之前需要設置哪端口,那個引腳就是下面這句代碼:

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);

    上述的大概就是下面這圖:

    接下來就是配置相應的EXTI:

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);exti_s.EXTI_Line = EXTI_Line13;exti_s.EXTI_Mode = EXTI_Mode_Interrupt;exti_s.EXTI_Trigger = EXTI_Trigger_Falling;exti_s.EXTI_LineCmd = ENABLE;EXTI_Init(&exti_s);

    4、書寫中斷服務函數

    以上配置好以后,需要書寫當中斷發生時做什么。當中斷響應以后會進入到相應的中斷服務函數中,對于中斷服務函數而言每一個中斷都有固定的函數名參數和返回類型,不可更改。
    具體的如下代碼:

    void EXTI1_IRQHandler(void) {if(EXTI_GetITStatus(EXTI_Line1) != RESET){GPIO_ResetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOD,GPIO_Pin_2);USART_Cmd(USART1,ENABLE);EXTI_ClearITPendingBit(EXTI_Line1);} }

    在這個中斷函數使用EXTI_GetITStatus(EXTI_Line1) != RESET來確定發生中斷,執行的程序放在該條件代碼塊內。
    在這個中斷函數中首先將兩個LED點亮,然后使能USART串口,最后清除中斷標志位,等待下次中斷。

    三、USART串口配置

    對于USART配置來說相對比較好記憶:

  • USART中GPIO的配置
  • USART的配置
  • 編寫發送的函數
  • 1、USART中GPIO的配置

    對于USART來說需要使用兩個GPIO,一個用作Tx一個用作Rx。
    對于這兩個的配置是不同的,對于Tx而言是發送口,需要將GPIO配置為復用推挽輸出,對于Rx而言是接收口,需要將GPIO配置為浮空輸入。
    同時USART的兩個口是固定的并且USART1和其他的掛載總線不一樣,就開啟的時鐘不一樣,用的時候現查吧!
    具體的配置代碼:

    GPIO_InitTypeDef gpio_s;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ENABLE);gpio_s.GPIO_Pin = GPIO_Pin_9;gpio_s.GPIO_Mode = GPIO_Mode_AF_PP;gpio_s.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&gpio_s);gpio_s.GPIO_Pin = GPIO_Pin_10;gpio_s.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&gpio_s);

    2、usart配置

    在USART配置中主要是配置相關的串口的一些參數,波特率、停止位等同時設定串口的接發模式。

    USART_InitTypeDef usart_s;usart_s.USART_BaudRate = 115200;usart_s.USART_WordLength = USART_WordLength_8b;usart_s.USART_StopBits = USART_StopBits_1;usart_s.USART_Parity = USART_Parity_No;usart_s.USART_HardwareFlowControl = USART_HardwareFlowControl_None;usart_s.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//USART_ITConfig(USART1,USART_IT_RXNE|USART_IT_TC,ENABLE);USART_Init(USART1,&usart_s);

    其中注釋的一行為串口中斷的開啟,在這里沒有使用所以就沒有開啟。

    3、編寫串口發送函數

    首先發送一個字符,然后將字符串一個一個字符的發送就可以了,庫函數提供了一個發送字節的函數,利用它發送然后得到發送完成標志位就可以了。具體實現代碼:

    void usart_SendByte(u8 b) {USART_SendData(USART1,b);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); }

    該函數實現了對單個字符的發送,接下來就是循環發送每個字符直到字符串的最后一個字符:
    具體實現代碼:

    void usart_SendString(u8* data) {while(*data){usart_SendByte(*data++);} }

    至此,所有的功能已經配置完畢,就等主函數來調兵譴將。
    在主函數調用函數,完成以上的配置,然后在死循環中一直發送某個數據,當按鍵一按下時開始發送,當按鍵而按下時停止發送==寫到這里才發現不是發報機,發報機是按下發送,彈起停止發送。尷尬了。。。==到底是個什么鬼,還是看看主函數吧:

    int main(void){GPIO_Config();EXTI_Config();USART_Config();usart_SendString("start");while(1){usart_SendString("hello\r\n");} }

    總結

    以上是生活随笔為你收集整理的STM32嘀!嘀!嘀!点触式发报机的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。