【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 是一個接收狀態寄存器,其各位的定義如下表:
| bit15 | bit14 | bit13~0 |
| 接收完成標志 | 接收到 0X0D 標志 | 接收到的有效數據個數 |
設計思路如下:
當接收到從電腦發過來的數據,把接收到的數據保存在 USART_RX_BUF 中,同時在接收狀態寄存器(USART_RX_STA)中計數接收到的有效數據個數,當收到回車(回車的表示由 2 個字節組成:0X0D 和 0X0A)的第一個字節 0X0D 時,計數器將不再增加,等待 0X0A 的到來,而如果 0X0A 沒有來到,則認為這次接收失敗,重新開始下一次接收。如果順利接收到 0X0A,則標記 USART_RX_STA 的第 15 位,這樣完成一次接收,并等待該位被其他程序清除,從而開始下一次的接收,而如果遲遲沒有收到 0X0D,那么在接收數據超過 USART_REC_LEN 的時候,則會丟棄前面的數據,重新接收。
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】端口复用和重映射,完全重映
- 下一篇: 【STM32】跑马灯实验主要程序代码分析