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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【STM32】SYSTEM文件夹介绍,delay,sys,usart

發布時間:2025/4/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32】SYSTEM文件夹介绍,delay,sys,usart 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • delay 文件夾
  • sys 文件夾
  • usart 文件夾
    • uart_init()
    • USART1_IRQHandler 函數
    • usart.h
    • 對串口 printf 的支持代碼

delay 文件夾

sys 文件夾

usart 文件夾

uart_init()

void uart_init(u32 bound){//GPIO端口設置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時鐘//USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.9//USART1_RX GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.10 //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =3;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器//USART 初始化設置USART_InitStructure.USART_BaudRate = bound; //串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長為8位數據格式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_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //開啟串口接受中斷USART_Cmd(USART1, ENABLE); //使能串口1 }

USART1_IRQHandler 函數

void USART1_IRQHandler(void) 函數是串口 1 的中斷響應函數,當串口 1 發生了相應的中斷后,就會跳到該函數執行。

這里我們設計了一個小小的接收協議:通過這個函數,配合一個數組 USART_RX_BUF[],一個接收狀態寄存器 USART_RX_STA(此寄存器其實就是一個全局變量,由作者自行添加。由于它起到類似寄存器的功能,這里暫且稱之為寄存器)實現對串口數據的接收管理。USART_RX_BUF 的大小由 USART_REC_LEN 定義,也就是一次接收的數據最大不能超過 USART_REC_LEN 個字節。

USART_RX_STA 是一個接收狀態寄存器,其各位的定義如下表:

USART_RX_STA
bit15bit14bit13~0
接收完成標志接收到 0X0D 標志接收到的有效數據個數

設計思路如下:
當接收到從電腦發過來的數據,把接收到的數據保存在 USART_RX_BUF 中,同時在接收狀態寄存器(USART_RX_STA)中計數接收到的有效數據個數,當收到回車(回車的表示由 2 個字節組成:0X0D 和 0X0A)的第一個字節 0X0D 時,計數器將不再增加,等待 0X0A 的到來,而如果 0X0A 沒有來到,則認為這次接收失敗,重新開始下一次接收。如果順利接收到 0X0A,則標記 USART_RX_STA 的第 15 位,這樣完成一次接收,并等待該位被其他程序清除,從而開始下一次的接收,而如果遲遲沒有收到 0X0D,那么在接收數據超過 USART_REC_LEN 的時候,則會丟棄前面的數據,重新接收。

#include "sys.h" #include "usart.h" #if EN_USART1_RX //如果使能了接收 //串口1中斷服務程序 //注意,讀取USARTx->SR能避免莫名其妙的錯誤 u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個字節. //接收狀態 //bit15, 接收完成標志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字節數目 u16 USART_RX_STA=0; //接收狀態標記 void USART1_IRQHandler(void) //串口1中斷服務程序 {u8 Res;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾){Res = USART_ReceiveData(USART1); //(USART1->DR)讀取接收到的數據if((USART_RX_STA&0x8000)==0) //接收未完成{if(USART_RX_STA&0x4000) //接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0; //接收錯誤,重新開始else USART_RX_STA|=0x8000; //接收完成了 }else //還沒收到0X0D{ if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF] = Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA = 0;//接收數據錯誤,重新開始接收 } }} } }

usart.h

#ifndef __USART_H #define __USART_H #include "stdio.h" #include "sys.h" #define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收 #define USART_REC_LEN 200 //定義最大接收字節數 200extern u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個字節.末字節為換行符 extern u16 USART_RX_STA; //接收狀態標記 //如果想串口中斷接收,請不要注釋以下宏定義 void uart_init(u32 bound); #endif

對串口 printf 的支持代碼

//加入以下代碼,支持printf函數,而不需要選擇use MicroLIB #if 1 #pragma import(__use_no_semihosting) //標準庫需要的支持函數 struct __FILE { int handle; }; FILE __stdout; //定義_sys_exit()以避免使用半主機模式 _sys_exit(int x) { x = x; } //重定義fputc函數 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循環發送,直到發送完畢 USART1->DR = (u8) ch; return ch; } #endif

總結

以上是生活随笔為你收集整理的【STM32】SYSTEM文件夹介绍,delay,sys,usart的全部內容,希望文章能夠幫你解決所遇到的問題。

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