欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 關于STM32單片機學習記錄與疑惑 [打印本頁]

作者: obito_497    時間: 2022-5-20 21:12
標題: 關于STM32單片機學習記錄與疑惑
STM32單片機學習中的一些疑惑與問題記錄

一、串口發送

  1、固件庫文件里面的 宏定義
#define USART_FLAG_CTS                       ((uint16_t)0x0200)
#define USART_FLAG_LBD                       ((uint16_t)0x0100)
#define USART_FLAG_TXE                       ((uint16_t)0x0080)
#define USART_FLAG_PE                        ((uint16_t)0x0001)
#define IS_USART_FLAG(FLAG) (((FLAG) == USART_FLAG_PE) || ((FLAG) == USART_FLAG_TXE) || \
                             ((FLAG) == USART_FLAG_TC) || ((FLAG) == USART_FLAG_RXNE) || \
                             ((FLAG) == USART_FLAG_IDLE) || ((FLAG) == USART_FLAG_LBD) || \
                             ((FLAG) == USART_FLAG_CTS) || ((FLAG) == USART_FLAG_ORE) || \
                             ((FLAG) == USART_FLAG_NE) || ((FLAG) == USART_FLAG_FE))

#define IS_USART_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFC9F) == 0x00) && ((FLAG) != (uint16_t)0x00))
#define IS_USART_PERIPH_FLAG(PERIPH, USART_FLAG) ((((*(uint32_t*)&(PERIPH)) != UART4_BASE) &&\
                                                  ((*(uint32_t*)&(PERIPH)) != UART5_BASE)) \
                                                  || ((USART_FLAG) != USART_FLAG_CTS))
#define IS_USART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 0x0044AA21))
#define IS_USART_ADDRESS(ADDRESS) ((ADDRESS) <= 0xF)
#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF)

                那種帶符號的是什么意思呢??????????????????

                這種符號是表示 它這個參數的取值可以是這個范圍之內的 或者是說必須是這幾個中的




                2、利用串口發送數據時,發送數據的函數sendbyte

void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{
        USART_SendData(pUSARTx, data);
        while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
}

/* 發送一個字節 */ // 形參是usart幾 所以要用結構體  傳輸八位的數據   
   //USART_FLAG_TC 是中斷標志位,RESET是0,USART_GetFlagStatus函數獲取標志位的狀態并返回。
當標志位為0,時,while停在此反復輪詢,直到標志位為1  (因為reset宏定義的是0 如果flag位也等于0 while里的成立 就一直死循環)


while( 1 ) { 代碼 }
意義:這里將會重復執行{}中的代碼
用途:
1.單片機在不使用操作系統時,主程序一般都使用這種架構
2.操作系統中的進程,執行任務時,有些也會使用這種架構
3.{}中的代碼不停地檢測某個條件,當條件符合時,跳出該循環,繼續向下執行
4.停留在此,等待中斷




                3、再利用串口發送數據時候(單片機向上位機發送)        

                void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{
        USART_SendData(pUSARTx, data);
        while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
}

                這句代碼的意思就是 單片機通過軟件(程序里main函數調用函數里面的參數來控制串口向上位機發送數據)
                而下一個實驗則是串口接受,就是上位機通過串口助手向單片機發送數據,單片機通過switch語句來判斷收到
        的字符串,并對齊進行相應的操作(調用編寫中斷服務函數)。


        二、串口接收

                1、外部中斷源IRQ ST公司給出了每個外設(引腳)對應的中斷源的宏定義 比如USART1、
                2、一般單片機內部使用的都是TTL電平,當有與外設相連接時,根據接口的不同會選擇不同的協議,USB就是一
                接口,當其與單片機通訊時需要進行usb轉串口電路(ch340驅動)

                3、
                        ch = getchar();
                這句代碼就是從鍵盤上輸入一個字符,
                         printf( "ch=%c\n",ch );
                這句代碼就是把收到的字符顯示在上位機上        


                4、但是我還存在一個疑問:
                為什么使用串口收發的時候沒有使用中斷呢?

作者: 人工置頂員    時間: 2022-5-21 06:58
頂一下
作者: Y_G_G    時間: 2022-5-21 13:43
一,宏定義實際上就是對寄存器的操作,就跟8051寫代碼一樣,如果不理解,就自己嘗試操作一下寄存器就知道了
二,有規定說串口一定有用中斷嗎?串口中斷的使用取決于有沒有必要和個人喜好
作者: yzwzfyz    時間: 2022-5-21 16:29
你調用了別人的函數,建議仔細讀通函數的說明。
再想一想如果是你寫這些函數,你會如何處理呢,可以邊學邊對比,收獲大大的。
串口的收發,如果不用中斷,效率是很差的!




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1