當前位置:
首頁 >
外部IO驱动设计
發布時間:2025/4/5
18
豆豆
文章目錄
- 1 外部IO驅動設計
1 外部IO驅動設計
此部分驅動較為簡單,主要是調用硬件驅動庫對寄存器讀寫。
由于這些庫的代碼執行速度很快,就沒有必要采用互斥信號量等實現保護,直接采用開關中斷來保護更有效率。
實現代碼如下:
extio.h:
/*** @brief 外部IO設計* @details* @author 01課堂 李述銅 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版權所有,禁止用于商業用途*/ #ifndef EXTIO_H #define EXTIO_Htypedef enum {ExtIOHigh,ExtIOLow }ExtIOState;typedef enum {ExtIOPin0 = 0,ExtIOPin1,ExtIOPin2,ExtIOPin3,ExtIOPinEnd, }ExtIOPin;void ExtIOInit (void); void ExtIOSetState (ExtIOPin pin, ExtIOState); ExtIOState ExtIOGetState (ExtIOPin pin); void ExtIOSetDir (ExtIOPin pin, uint8_t isInput);#endif //PROJECT_EXTIO_Hextio.c:
/*** @brief 外部IO設計* @details* @author 01課堂 李述銅 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版權所有,禁止用于商業用途*/ #include "tinyOS.h" #include "extio.h" #include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIOstatic uint16_t extioMap[ExtIOPinEnd] = {GPIO_Pin_1, // 對應ExtIOPin0,以下類堆GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4 };/*** 初始化外部IO*/ void ExtIOInit (void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure); }/*** 設置指定IO引腳狀態* @param pin 需配置的IO* @param state 配置的狀態值*/ void ExtIOSetState (ExtIOPin pin, ExtIOState state) {tTaskCritical_t critical;uint16_t halPin = extioMap[pin];critical = tTaskEnterCritical();if (state == ExtIOHigh) {GPIO_SetBits(GPIOA, halPin);} else {GPIO_ResetBits(GPIOA, halPin);}tTaskExitCritical(critical); }/*** 獲取指定引腳的狀態* @param pin 需獲取的引腳* @return 引腳的狀態*/ ExtIOState ExtIOGetState (ExtIOPin pin) {uint16_t halPin = extioMap[pin];uint8_t state = GPIO_ReadInputDataBit(GPIOA, halPin);return (state == Bit_SET) ? ExtIOHigh : ExtIOLow; }/*** 設置管腳狀態* @param pin* @param isInput*/ void ExtIOSetDir (ExtIOPin pin, uint8_t isInput) {tTaskCritical_t critical;GPIO_InitTypeDef GPIO_InitStructure;uint16_t halPin = extioMap[pin];critical = tTaskEnterCritical();GPIO_InitStructure.GPIO_Pin = halPin;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = isInput ? GPIO_Mode_IPU : GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);tTaskExitCritical(critical); }app.c:
/*** @brief tOS應用示例* @details* @author 01課堂 李述銅 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版權所有,禁止用于商業用途*/ #include "tinyOS.h" #include "app.h" #include "hal.h"#include "button.h" #include "uart.h" #include "extio.h"static tTaskStack task1Env[TASK1_ENV_SIZE]; // 任務1的堆棧空間 static tTask task1;void task1Entry (void * param) {for (;;) {ExtIOSetDir(ExtIOPin0, 0);ExtIOSetState(ExtIOPin0, ExtIOHigh);tTaskDelay(1);ExtIOSetDir(ExtIOPin1, 1);ExtIOSetDir(ExtIOPin2, 0);ExtIOSetState(ExtIOPin2, ExtIOGetState(ExtIOPin1));tTaskDelay(1);} }/*** App的初始化*/ void tInitApp (void) {halInit();ButtonInit();UartInit();ExtIOInit();tTaskInit(&task1, task1Entry, (void *) 0x0, TASK1_PRIO, task1Env, sizeof(task1Env)); }參考資料:
總結
- 上一篇: 串口驱动设计
- 下一篇: Socket基础API介绍