STM32-UART-發(fā)送/接收 學(xué)習(xí)筆記

STM32_Study: STM32_Study (gitee.com)

不逼逼 貼代碼

usart.c
#include "stm32f10x.h"
#include "usart.h"
#include <stdio.h>

/**
 * @brief
 * UART:通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter)
 * 庫  : STM32F10x_StdPeriph_Lib_V3.5.0
 *
 */
void usart1_init(void)
{
    // 1.使能時鐘 GPIO / USART
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // GPIO時鐘使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // USART時鐘使能

    // 2.配置GPIO_pin腳 TX / RX
    GPIO_InitTypeDef gpio_initStructure;                  // GPIO_INIT結(jié)構(gòu)體
    gpio_initStructure.GPIO_Pin = GPIO_Pin_9;             //配置引腳
    gpio_initStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //復(fù)用推挽輸出
    gpio_initStructure.GPIO_Speed = GPIO_Speed_50MHz;     //速度
    GPIO_Init(GPIOA, &gpio_initStructure);                //初始化 輸出引腳
    gpio_initStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
    gpio_initStructure.GPIO_Pin = GPIO_Pin_10;            //配置引腳
    GPIO_Init(GPIOA, &gpio_initStructure);                //初始化 輸入引腳

    // 3.UART初始化并使能
    USART_InitTypeDef usart_init_type_def;                                          // usart結(jié)構(gòu)體
    usart_init_type_def.USART_BaudRate = 115200;                                    //波特率  115200
    usart_init_type_def.USART_WordLength = USART_WordLength_8b;                     //長度 8bit
    usart_init_type_def.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                 // usart模式  輸入和輸出
    usart_init_type_def.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制 無
    usart_init_type_def.USART_Parity = USART_Parity_No;                             //校驗位 無
    usart_init_type_def.USART_StopBits = USART_StopBits_1;                          //停止位 1
    USART_Init(USART1, &usart_init_type_def);                                       //初始化usart
    USART_Cmd(USART1, ENABLE);                                                      //使能USART1

    //至此,發(fā)送已經(jīng)可以使用
    //可調(diào)用USART_SendData(USART1, (uint16_t)data) 發(fā)送數(shù)據(jù)
    //也可以重寫fputc然后使用printf()打印函數(shù)(下方有該函數(shù));

    // 4.1使能接收中斷
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中斷 USART_IT_RXNE:Receive Data register not empty interrupt 非空中斷(字面意思)

    // 4.2NVIC配置  “內(nèi)嵌向量中斷控制器:Nested Vectored Interrupt Controller (NVIC)”
    NVIC_InitTypeDef nvic_init_type_def;                      // NVIC_Init 結(jié)構(gòu)體
    nvic_init_type_def.NVIC_IRQChannel = USART1_IRQn;         //通道配置
    nvic_init_type_def.NVIC_IRQChannelCmd = ENABLE;           //使能
    nvic_init_type_def.NVIC_IRQChannelPreemptionPriority = 1; //搶占優(yōu)先級
    nvic_init_type_def.NVIC_IRQChannelSubPriority = 1;        //響應(yīng)優(yōu)先級
    NVIC_Init(&nvic_init_type_def);
}

/**
 * @brief 重載C prinf的調(diào)用函數(shù)
 * 注:需要開啟KEIL軟件里面的 Target->User Micro LIB 選項
 *
 * @param ch
 * @param f
 * @return int
 */
int fputc(int ch, FILE *f)
{

    // while ((USART1->SR & 0X40) == 0);
    // //DR:數(shù)據(jù)寄存器
    // USART1->DR = (uint16_t)ch;
    // return ch;

    // 獲取標(biāo)志位:USART1->SR
    // SR:status register, 狀態(tài)寄存器
    // USART_FLAG_TC (=0X40) : Transmission Complete flag 發(fā)送完成標(biāo)志
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        ;
    //循環(huán)發(fā)送,直到發(fā)送完畢
    USART_SendData(USART1, (uint16_t)ch);
    return ch;
}
/**
 * @brief 配置中斷4.1/4.2后,觸發(fā)中斷時中斷系統(tǒng)會調(diào)用該函數(shù)
 *
 */
void USART1_IRQHandler(void)
{
    uint16_t data;
    //判斷USART1當(dāng)前狀態(tài)是否是非空中斷
    // USART_IT_RXNE(0x0525):Receive Data register not empty interrupt 非空中斷
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        //接收數(shù)據(jù) return : uint16_t
        data = USART_ReceiveData(USART1);
        //接收完畢 發(fā)送出去 (測試使用)
        //可以創(chuàng)建接收數(shù)據(jù)uint8_t temp[10]將每一個數(shù)據(jù)合并一起.
        USART_SendData(USART1, data);
    }
}
/**
 * @brief 測試
 *
 */
void usart1_test(void)
{
    printf("Hello world !");
}

usart.h
#include "stm32f10x.h"
#ifndef __USART_H__
#define __USART_H__

//初始化uart
void usart1_init(void);

//測試
void usart1_test(void);

#endif

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悦荒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荔烧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗抑,死亡現(xiàn)場離奇詭異诱建,居然都是意外死亡钮蛛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門受神,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抛猖,“玉大人,你說我怎么就攤上這事〔浦” “怎么了联四?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撑教。 經(jīng)常有香客問我朝墩,道長,這世上最難降的妖魔是什么伟姐? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任收苏,我火速辦了婚禮,結(jié)果婚禮上愤兵,老公的妹妹穿的比我還像新娘鹿霸。我一直安慰自己,他們只是感情好秆乳,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布懦鼠。 她就那樣靜靜地躺著,像睡著了一般屹堰。 火紅的嫁衣襯著肌膚如雪肛冶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天双藕,我揣著相機與錄音淑趾,去河邊找鬼。 笑死忧陪,一個胖子當(dāng)著我的面吹牛扣泊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘶摊,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼延蟹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叶堆?” 一聲冷哼從身側(cè)響起阱飘,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虱颗,沒想到半個月后沥匈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡忘渔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年高帖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畦粮。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡散址,死狀恐怖乖阵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情预麸,我是刑警寧澤瞪浸,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站吏祸,受9級特大地震影響对蒲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犁罩,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一齐蔽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧床估,春花似錦含滴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至递胧,卻和暖如春碑韵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缎脾。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工祝闻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遗菠。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓联喘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辙纬。 傳聞我的和親對象是個殘疾皇子豁遭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容