蓝桥杯嵌入式CT117E硬件开发平台经验分享11 | 第九届蓝桥杯国赛题
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯嵌入式CT117E硬件开发平台经验分享11 | 第九届蓝桥杯国赛题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
基于 基于 CT117E 嵌入式競(jìng)賽板 嵌入式競(jìng)賽板 的 “電子秤”程序設(shè)計(jì)與調(diào)試
賽題硬件框圖
由于賽題細(xì)節(jié)多,賽題PDF要求書(shū)放入了附件,鏈接后續(xù)加入。本文主要講述本屆題目的困難點(diǎn):擴(kuò)展板的AD按鍵,串口輸出。
1. 由于本屆賽題用到了擴(kuò)展版的AD按鍵,只要讀取AD的值,并根據(jù)不同按鍵AD值就可以判斷出是哪個(gè)按鍵按下,但本屆的難點(diǎn)在于既是AD按鍵,又要求按鍵長(zhǎng)短按有不同的功能,所以相對(duì)來(lái)說(shuō)就需要設(shè)計(jì)按鍵的思路了。本文用到的方法其實(shí)就是在原中斷按鍵掃描的基礎(chǔ)上進(jìn)行替換設(shè)計(jì)的。無(wú)非是把按鍵掃描函數(shù)換成了AD值的判斷。實(shí)現(xiàn)方法如下:
#ifndef __ADC_KEY_H #define __ADC_KEY_H#include "stm32f10x.h" #include "bsp_adc.h" //需要依賴(lài)adc配置 #include "bsp_GeneralTim.h" //需要依賴(lài)時(shí)鐘提供時(shí)許 #include "Def_config.h" // 需要依賴(lài)宏定義typedef struct{ u8 KEY_VALUE; //使用數(shù)據(jù)后及時(shí)清除到0xff !!!JUDGE_ENUM IS_Key_ShortPress; //使用數(shù)據(jù)后及時(shí)清除到FAUSE狀態(tài)!!!JUDGE_ENUM IS_Key_LongPress; //判斷長(zhǎng)按否? 不需要認(rèn)為清除JUDGE_ENUM IS_Key_LongFresh; //長(zhǎng)按刷新,長(zhǎng)按多久按鍵計(jì)算快速累加或累減一次使用數(shù)據(jù)后及時(shí)清除到FAUSE狀態(tài)!!!!JUDGE_ENUM IS_Key_Touch; //按鍵是否按下 }KEYSCANF_TypeDef; extern KEYSCANF_TypeDef KEYSCANF_Structure;/********************當(dāng)前設(shè)置的按鍵掃描中斷為 5MS************/ #define KEY_LONGSTATUS_Time 800000/GENERAL_TIM_SetUs // 多久算長(zhǎng)按 #define KEY_EliShaking_Time 10000/GENERAL_TIM_SetUs // 按鍵消抖值 #define Key_LongTimeSet 100000/GENERAL_TIM_SetUs //按鍵長(zhǎng)按后多久更新一次 比如長(zhǎng)按后加一,本設(shè)置為多久加一extern u8 Key_Scan(void); extern void Key_Interrup(void);#endif #include "Adc_Key.h" /******************************************************************************* * 文件名稱(chēng):擴(kuò)展版AD按鍵函數(shù) PA5 - ADC1 CH5 * 作者: PANDAS * 單位: 廣西師范大學(xué)電子工程學(xué)院電子與通信工程研究生 * 聯(lián)系方式:lpf0503@hotmail.com * * 程序說(shuō)明: 按鍵松開(kāi) -- 3.3V |4095 * S1 S2 S3 S4 * 0V 0.43V 0.93V 1.42V | 0 540 1157 1764 * S5 S6 S7 S8 * 1.92V 2.33V 2.84V 3.22V | 2380 2890 3518 3998 * 注意:#include "bsp_adc.h" //需要依賴(lài)adc配置 * 日期版本:2020-10-17 V1.0 *******************************************************************************/ extern __IO uint16_t ADC_ConvertedValue[NOFCHANEL]; u8 Key_Scan(void) {if(ADC_ConvertedValue[1] < 100) {return 1;} else if(ADC_ConvertedValue[1] < 800){return 2;}else if(ADC_ConvertedValue[1] < 1500){return 3;}else if(ADC_ConvertedValue[1] < 2000){return 4;}else if(ADC_ConvertedValue[1] < 2500){return 5;}else if(ADC_ConvertedValue[1] < 3200){return 6;}else if(ADC_ConvertedValue[1] < 3700){return 7;}else if(ADC_ConvertedValue[1] < 4020){return 8;}else{return 0xff;} } /*** @說(shuō)明 按鍵狀態(tài)機(jī)函數(shù)* @參數(shù) none* @返回值 None* @注意 1.按鍵狀態(tài)機(jī)只做出 狀態(tài), 但不消除狀態(tài)2.KEYSCANF_Structure.KEY_VALUE ,KEYSCANF_Structure.IS_Key_ShortPress 被使用后需要人為復(fù)位0xff,FALSE,這樣才能保證每一次的狀態(tài)都能被處理3.Key_Interrup()函數(shù)需要放入定時(shí)器中斷,且中斷時(shí)間小于10MS,最好為10的公約數(shù):如1,2,5MS 例程: @1: 按鍵初始化放入main.c @2: 中斷放入函數(shù)extern void Key_Interrup(void);void TIM4_IRQHandler(void){Key_Interrup();} @3:按鍵處理函數(shù)void KEY_Proc(void){static u8 i = 0;if(KEYSCANF_Structure.KEY_VALUE != 0xff) // There are remaining parking spaces{ switch(KEYSCANF_Structure.KEY_VALUE){case 1:if(KEYSCANF_Structure.IS_Key_ShortPress == TRUE){KEYSCANF_Structure.IS_Key_ShortPress = FALSE; //!!!手動(dòng)清除短按標(biāo)志位短按處理自制函數(shù)();}break;case 2: if(KEYSCANF_Structure.IS_Key_LongPress == TRUE){長(zhǎng)按處理自制函數(shù)();}break;case 3: if(KEYSCANF_Structure.IS_Key_LongPress == TRUE){if(KEYSCANF_Structure.IS_Key_LongFresh == TRUE){KEYSCANF_Structure.IS_Key_LongFresh = FALSE; //手動(dòng)清除快速按鍵刷新標(biāo)志位長(zhǎng)按處理快速累加/累減自制函數(shù)();}}break;}KEYSCANF_Structure.KEY_VALUE = 0xff; //在此清除的目的在于 不至于在狀態(tài)機(jī)中有按鍵值,而在按鍵處理函數(shù)檢測(cè)時(shí)已經(jīng)被狀態(tài)機(jī)刷新銷(xiāo)毀,上面switch判斷后才能清除!}}* @包含出處 #include "bsp_key_statemachine.h"*/ u8 keyCheck = 0; uint8_t keyState = 0; uint16_t keyPrev = 0xff; //上一次的鍵值 u32 keyLongCheck = 0; u16 Key_LongTime = 0; u8 keyCountTime = 0; KEYSCANF_TypeDef KEYSCANF_Structure = {0xff,FALSE,FALSE,FALSE,FALSE}; void Key_Interrup(void) {uint8_t keyPress = 0xff;keyCountTime ++;if(keyCountTime >= KEY_EliShaking_Time) //消抖完成{keyCountTime = 0;keyCheck = 1;}if(keyCheck == 1){keyCheck = 0;keyPress = Key_Scan();switch(keyState){case 0://按鍵未按下態(tài)if(keyPress != 0xff)//表示有按鍵按下{keyPrev = keyPress; //記錄當(dāng)前按鍵狀態(tài)keyState = 1;}else{keyState = 0;}break;case 1://表示有按鍵按下,判斷當(dāng)前值和上一次的值是否一樣,若不一樣則為抖動(dòng)!if(keyPress == keyPrev)//不是抖動(dòng){keyState = 2;}else{keyState = 0; //是抖動(dòng)!返回上一層keyPrev = 0xff;} break;case 2:if(keyPress != keyPrev)//表示按鍵已松開(kāi),只有長(zhǎng)按狀態(tài)被清除,長(zhǎng)按計(jì)時(shí)結(jié)束,短按狀態(tài)不清除,等待用戶(hù)使用并清除{ if(keyLongCheck < KEY_LONGSTATUS_Time) //短按{KEYSCANF_Structure.IS_Key_ShortPress = TRUE; KEYSCANF_Structure.KEY_VALUE = keyPrev;}KEYSCANF_Structure.IS_Key_LongPress = FALSE;keyPrev = 0xff;keyState = 0; // 按鍵結(jié)束返回初始狀態(tài)機(jī)keyLongCheck = 0; //長(zhǎng)按計(jì)時(shí)清0Key_LongTime = 0;}else{ keyLongCheck++;if(keyLongCheck >= KEY_LONGSTATUS_Time)//按下時(shí)間超過(guò) 長(zhǎng)按時(shí)間 ,可以直接累加,因?yàn)槌^(guò)長(zhǎng)按時(shí)間之后每隔掃描時(shí)間(10MS)就可以返回一次按鍵值,而且按鍵值用過(guò)后會(huì)清除{keyLongCheck = KEY_LONGSTATUS_Time + 1;KEYSCANF_Structure.KEY_VALUE = keyPrev; //返回值標(biāo)記哪個(gè)按鍵 ,在調(diào)用后清除,所以可以直接做到累加功能KEYSCANF_Structure.IS_Key_ShortPress = FALSE;KEYSCANF_Structure.IS_Key_LongPress = TRUE; }}break;default : break;}}if(KEYSCANF_Structure.IS_Key_LongPress == TRUE) //按鍵長(zhǎng)按 刷新,進(jìn)行長(zhǎng)按快速累減或累加使用,人為設(shè)定多久累加一次{Key_LongTime ++;if(Key_LongTime >= Key_LongTimeSet){Key_LongTime = 0;KEYSCANF_Structure.IS_Key_LongFresh = TRUE;}} }2. 按鍵是AD采集,用到了ADC的DMA讀取。
#ifndef __ADC_H #define __ADC_H#include "stm32f10x.h" #include "Def_config.h"// ADC 編號(hào)選擇 // 可以是 ADC1/2,如果使用ADC3,中斷相關(guān)的要改成ADC3的 #define ADCx ADC1 #define ADC_CLK RCC_APB2Periph_ADC1// ADC GPIO宏定義 // 注意:用作ADC采集的IO必須沒(méi)有復(fù)用,否則采集電壓會(huì)有影響 #define ADC_GPIO_CLK RCC_APB2Periph_GPIOA #define ADC_PORT GPIOA #define ADC_PIN (GPIO_Pin_4 | GPIO_Pin_5)// ADC 中斷相關(guān)宏定義 #define ADC_IRQ ADC1_2_IRQn #define ADC_IRQHandler ADC1_2_IRQHandler#define ADC1_DR_Address ((uint32_t)0x4001244C)// 轉(zhuǎn)換通道個(gè)數(shù) #define NOFCHANEL 2 // ADC1轉(zhuǎn)換的電壓值通過(guò)MDA方式傳到SRAM extern __IO uint16_t ADC_ConvertedValue[NOFCHANEL]; extern void ADCx_Init(void); extern void ADC_Read(u8 Channel_x);#endif /* __ADC_H */ #include "bsp_adc.h" /******************************************************************************* * 文件名稱(chēng):ADC采集驅(qū)動(dòng) * 作者: PANDAS * 單位: 廣西師范大學(xué)電子工程學(xué)院電子與通信工程研究生 * 聯(lián)系方式:lpf0503@hotmail.com * 實(shí)驗(yàn)?zāi)康?#xff1a;1. * 2. * 程序說(shuō)明:1.開(kāi)發(fā)板R37電位器: PB0-ADC1 channel 8 ADC1 12位分辨率 0xfff:2^12 = 4096 * 2.開(kāi)發(fā)板RP5電位器: PA4-ADC1 channel 4 3.開(kāi)發(fā)板RP6電位器: PA5-ADC1 channel 5 * 日期版本:2020-10-17 V1.0 *******************************************************************************/ __IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0}; /*** @brief ADC GPIO 初始化* @param 無(wú)* @retval 無(wú)*/ static void ADCx_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;// 打開(kāi) ADC IO端口時(shí)鐘RCC_APB2PeriphClockCmd( ADC_GPIO_CLK, ENABLE );// 配置 ADC IO 引腳模式// 必須為模擬輸入GPIO_InitStructure.GPIO_Pin = ADC_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;// 初始化 ADC IOGPIO_Init(ADC_PORT, &GPIO_InitStructure); } static void ADCx_DMA_Config(void) {DMA_InitTypeDef DMA_InitStructure;// 打開(kāi)DMA時(shí)鐘RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel1); // 復(fù)位DMA控制器 ADC1 對(duì)應(yīng) DMA1通道1,ADC3對(duì)應(yīng)DMA2通道5,ADC2沒(méi)有DMA功能DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // 復(fù)位DMA控制器DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue; // 存儲(chǔ)器地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 數(shù)據(jù)源來(lái)自外設(shè)DMA_InitStructure.DMA_BufferSize = NOFCHANEL; // 緩沖區(qū)大小,應(yīng)該等于數(shù)據(jù)目的地的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外設(shè)寄存器只有一個(gè),地址不用遞增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 存儲(chǔ)器地址遞增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外設(shè)數(shù)據(jù)大小為半字,即兩個(gè)字節(jié)DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 內(nèi)存數(shù)據(jù)大小也為半字,跟外設(shè)數(shù)據(jù)大小相同DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循環(huán)傳輸模式DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMA 傳輸通道優(yōu)先級(jí)為高,當(dāng)使用一個(gè)DMA通道時(shí),優(yōu)先級(jí)設(shè)置不影響DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 禁止存儲(chǔ)器到存儲(chǔ)器模式,因?yàn)槭菑耐庠O(shè)到存儲(chǔ)器DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 初始化DMA/* Enable DMA1 channel1 */DMA_Cmd(DMA1_Channel1, ENABLE); // 使能 DMA 通道 } /*** @brief 配置ADC工作模式* @param 無(wú)* @retval 無(wú)*/ static void ADCx_Mode_Config(void) {ADC_InitTypeDef ADC_InitStructure; // 打開(kāi)ADC時(shí)鐘RCC_APB2PeriphClockCmd( ADC_CLK, ENABLE );// ADC 模式配置// 只使用一個(gè)ADC,屬于獨(dú)立模式ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;// 禁止掃描模式,多通道才要,單通道不需要ADC_InitStructure.ADC_ScanConvMode = ENABLE ; // 連續(xù)轉(zhuǎn)換模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 不用外部觸發(fā)轉(zhuǎn)換,軟件開(kāi)啟即可ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// 轉(zhuǎn)換結(jié)果右對(duì)齊ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;// 轉(zhuǎn)換通道x個(gè)ADC_InitStructure.ADC_NbrOfChannel = NOFCHANEL; // 初始化ADCADC_Init(ADCx, &ADC_InitStructure);// 配置ADC時(shí)鐘為PCLK2的8分頻,72/8 即9MHzRCC_ADCCLKConfig(RCC_PCLK2_Div8); // 配置 ADC 通道轉(zhuǎn)換順序和采樣時(shí)間ADC_RegularChannelConfig(ADCx, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADCx, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5); // ADC_AutoInjectedConvCmd(ADCx,ENABLE);// 使能ADC DMA 請(qǐng)求ADC_DMACmd(ADCx, ENABLE);// 開(kāi)啟ADC ,并開(kāi)始轉(zhuǎn)換ADC_Cmd(ADCx, ENABLE);// 初始化ADC 校準(zhǔn)寄存器 ADC_ResetCalibration(ADCx);// 等待校準(zhǔn)寄存器初始化完成while(ADC_GetResetCalibrationStatus(ADCx));// ADC開(kāi)始校準(zhǔn)ADC_StartCalibration(ADCx);// 等待校準(zhǔn)完成while(ADC_GetCalibrationStatus(ADCx));// 由于沒(méi)有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換 ADC_SoftwareStartConvCmd(ADCx, ENABLE); } /*** @brief ADC初始化* @param 無(wú)* @retval 無(wú)* @attention 別忘了main.c調(diào)用初始化*/ void ADCx_Init(void) {ADCx_GPIO_Config();ADCx_DMA_Config();ADCx_Mode_Config(); } /*********************************************END OF FILE**********************/3. 串口調(diào)用,其實(shí)就是接收數(shù)據(jù)、判斷、發(fā)送的過(guò)程。
#ifndef __USART2_H #define __USART2_H#include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "Def_config.h"#define USART2_RecTab_Max 50 typedef struct{ char USART2_RecTab[USART2_RecTab_Max];u8 USART2_RecNum ;JUDGE_ENUM IS_USART2_ReceiveStart;JUDGE_ENUM IS_USART2_RecSucess; }USART2REC_TypeDef; extern USART2REC_TypeDef USART2REC_Structure; //USART2 接收定義。在別的函數(shù)調(diào)用需要extern extern void USART2_Config(u16 USATR2_Boads); extern void USART2_SendString(char *str);#endif #include "usart2.h" #include <stdio.h> //需要用此頭文件,若Main函數(shù)調(diào)用printf,則也需要添加 #include <string.h> /*** @說(shuō)明 STATE_ENUM類(lèi)型需要包含#include "Def_config.h" ***/ #include "Def_config.h" /******************************************************************************* * 文件名稱(chēng):串口二驅(qū)動(dòng)函數(shù) * 作者: PANDAS * 單位: 廣西師范大學(xué)電子工程學(xué)院電子與通信工程研究生 * 聯(lián)系方式:lpf0503@hotmail.com * 實(shí)驗(yàn)?zāi)康?#xff1a;1. * 2. * 程序說(shuō)明:1.藍(lán)橋杯嵌入式開(kāi)發(fā)板調(diào)試接口 * 2. * 日期版本:2020-10-17 V1.0 *******************************************************************************/ USART2REC_TypeDef USART2REC_Structure; //USART2 接收定義。在別的函數(shù)調(diào)用需要extern /*** @說(shuō)明 配置中斷向量控制器* @參數(shù) None* @返回值 None* @注意 NVIC_Priority_Structure.USART2_Priority;需要提前配置*/ void NVIC_USART2Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/* Enable the RTC Interrupt */NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_Priority_Structure.USART2_Priority;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); } /*** @說(shuō)明 USART2 相關(guān)GPIO和工作模式配置* @參數(shù) None * @返回值 None* @GPIO PA2:TX2 PA3:RX2*/ void USART2_Config(u16 USATR2_Boads) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //在使用串口復(fù)用功能的時(shí)候,要開(kāi)啟相應(yīng)的功能時(shí)鐘USARTNVIC_USART2Configuration();//配置USART2 TX引腳工作模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//配置USART2 RX引腳工作模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入模式GPIO_Init(GPIOA, &GPIO_InitStructure);//串口2工作模式配置USART_InitStructure.USART_BaudRate = USATR2_Boads;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ; //奇偶校驗(yàn)位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //不采用硬件流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //串口模式:雙線(xiàn)全雙工USART_Init(USART2, &USART_InitStructure);USART_ITConfig(USART2, USART_IT_TXE, DISABLE);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能USART2接收中斷!!!USART_Cmd(USART2, ENABLE); //使能USART外設(shè)!!!!!,勿忘 } /*** @說(shuō)明 USART2字符串發(fā)送函數(shù)* @參數(shù) str: 指向字符串的指針* @返回值 None*/ void USART2_SendString(char *str) {uint8_t index = 0; //注意,在此的字符串?dāng)?shù)組長(zhǎng)度,超過(guò)255則,需要修改index類(lèi)型。do{USART_SendData(USART2,str[index]);while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);index++; }while(str[index] != 0); //檢查字符串結(jié)束標(biāo)志 } /*** @說(shuō)明 串口中斷接收處理* @參數(shù) none* @返回值 None* @包含出處 #include "usart2.h"* @注意 需要將此放入對(duì)應(yīng)定時(shí)器的中斷函數(shù)中* 如:在stm32f10x_it.c中:* extern void USART2_Receive(void);* void USART2_IRQHandler(void)* {* USART2_Receive();* }*/ void USART2_Receive(void) {char ucTemp=0;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //使用 if 語(yǔ)句來(lái)判斷是否是真的產(chǎn)生 USART 數(shù)據(jù)接收這個(gè)中斷事件{USART_ClearITPendingBit(USART2, USART_IT_RXNE);ucTemp = USART_ReceiveData(USART2);if(ucTemp == 'C' || ucTemp == 'S'){ USART2REC_Structure.USART2_RecNum = 0;USART2REC_Structure.IS_USART2_ReceiveStart = TRUE;memset(USART2REC_Structure.USART2_RecTab,0x00,USART2_RecTab_Max);} if(USART2REC_Structure.IS_USART2_ReceiveStart == TRUE){USART2REC_Structure.USART2_RecTab[USART2REC_Structure.USART2_RecNum++] = USART_ReceiveData(USART2);}if(USART2REC_Structure.USART2_RecNum > USART2_RecTab_Max - 1){USART2REC_Structure.USART2_RecNum = 0;}if(ucTemp == '\n' || USART2REC_Structure.USART2_RecNum > 0){USART2REC_Structure.IS_USART2_RecSucess = TRUE;USART2REC_Structure.IS_USART2_ReceiveStart = FALSE; // 跟USART2REC_Structure.USART2_RecNum>0聯(lián)用,獲取有效字節(jié)個(gè)數(shù)}} } /*** @說(shuō)明 重定向C庫(kù)函數(shù)printf 到USART2* @參數(shù) None* @返回值 None* @ 由printf函數(shù)調(diào)用* @ 需要stdio.h頭文件支持, 編譯器選項(xiàng)中的target->Use MicroLIB需要勾選!!!!!!!!!!!!!*/ int fputc(int ch, FILE *f) {USART_SendData(USART2,(unsigned char) ch);while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET); //檢查串口發(fā)送是否完成標(biāo)志位return (ch); } ///重定向c庫(kù)函數(shù)scanf到串口,重寫(xiě)向后可使用scanf、getchar等函數(shù) int fgetc(FILE *f) {/* 等待串口輸入數(shù)據(jù) */while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(USART2); }總結(jié)
以上是生活随笔為你收集整理的蓝桥杯嵌入式CT117E硬件开发平台经验分享11 | 第九届蓝桥杯国赛题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 20164305徐广皓 - Exp1 P
- 下一篇: 人生感悟4