
發布
注冊
/
登錄GPIO的案例
非常不錯的文章|GPIO模擬串口
0x23,二進制表示為00100011,傳輸順序為1->1->0->0->0->1->0->0
掌握清楚這個時序那么也就好用GPIO模擬了,除了需要兩個GPIO,還需要兩個定時器(分別用于接收和發送時序控制),另外需要說明的是,為方便起見,采樣頻率這里就設置成了波特率。
1) 對于接收,當RX引腳檢測到下降沿時,進入GPIO中斷,然后開啟一個定時器,第一次定時器周期設置為1/波特率的一半(目的是為了在中心處判斷是否為低電平,以表示是否為起始位),再之后就可以設置定時器周期為1/波特率,每隔此周期在定時器中斷里去采樣RX引腳電平,將數據接收完畢
2)對于發送,首先發送一個起始位,之后以1/波特率為周期,在定時器中斷里去發送比特位即可。
我在NXP的MCU上做了實現,經過測試波特率可以達到38400. 有需要代碼的添加管理員微信獲取(見本文最后二維碼)。
以下是對程序的簡單說明:
1)gpio_uart_demo_init() 里可以配置UART的相關參數,如波特率,奇偶校驗,數據位長度
2)void gpio_uart_read(uint8_t *bufptr, uint32_t size, void (*rx_callback)(void)) 這個函數為uart 接收函數,第一個參數為數據存放buffer,第二個數據為接收長度,第三個參數為callback函數。注意目前的實現是調用此函數后,當接收完指定長度數據后,會停止接收數據。 如果之后要繼續接收,需要再次調用這個函數。
展開 干貨|用3個IO口控制6個LED燈,怎么做到的?
查理復用是一種能夠在驅動LED,特別是驅動大量LED時有效地節約GPIO的方法。
使用該方法,n個GPIO可以驅動 n*(n-1) 個LED,所以:
使用2個GPIO可以驅動2個LED。
使用3個GPIO可以驅動6個LED。
使用4個GPIO可以驅動12個LED。
以此類推。
這種方式能夠實現的基礎是:
單片機GPIO的三個狀態:高電平、低電平、高阻態。
LED具有單向導電性。
查理復用設計的方法:
任意兩個GPIO引腳之間串入兩個LED,這兩個LED為并聯,且LED方向相反。
當你想要點亮某個特定的LED時,就將其兩端所連接到的GPIO引腳分別設定為高電平和低電平,其它剩余的GPIO引腳設定為高阻態。
前面電動牙刷中6個LED燈的電路,就是這么設計的。
下面從最簡單的開始,一步一步體會查理復用的電路設計。
1、使用2個GPIO時最簡單:
LED1亮起時:
LED2亮起時:
這里只用到高電平、低電平的狀態,不需要用高阻態的狀態。
2、使用3個GPIO時,前面已經分析過:
可以等效為下圖:
可以看出,確實是任意兩個GPIO之間均串入了兩個并聯的LED,且LED方向相反。
3、同樣的原理,使用4個GPIO時:
點亮LED1時:
其他LED亮起的情況不再列舉。
查理復用這樣的電路接法也會引發一些問題。
首先,LED亮起時完全由單片機的GPIO輸出電流,所以對于GPIO的電流驅動能力有一定的要求。
展開 看完這篇,不要說不懂串口通信!
GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* 第一步:初始化GPIO */
// 打開串口GPIO的時鐘
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
// 將USART Tx的GPIO配置為推挽復用模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
// 將USART Rx的GPIO配置為浮空輸入模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
/* 第二步:配置串口的初始化結構體 */
// 打開串口外設的時鐘
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
// 配置串口的工作參數
// 配置波特率
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
// 配置 針數據字長
USART_InitStructure.USART_WordLength
展開 學好這些知識點,單片機不用怕!
最終用固件庫實現就變成這樣:
// 定義一個GPIO_InitTypeDef 類型的結構體
GPIO_InitTypeDef GPIO_InitStructure;
// 選擇要控制的IO 口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
// 設置引腳為推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// 設置引腳速率為50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
/*調用庫函數,初始化GPIOB0*/
GPIO_Init(GPIOB, &GPIO_InitStructure);
倘若同一端口下不同引腳有不同的模式配置,每次對每個引腳配置完成后都要調用GPIO初始化函數,代碼如下:
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init
展開 
從這些知識點入手,學單片機就簡單多了
最終用固件庫實現就變成這樣:
// 定義一個GPIO_InitTypeDef 類型的結構體
GPIO_InitTypeDef GPIO_InitStructure;
// 選擇要控制的IO 口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
// 設置引腳為推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// 設置引腳速率為50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
/*調用庫函數,初始化GPIOB0*/
GPIO_Init(GPIOB, &GPIO_InitStructure);
倘若同一端口下不同引腳有不同的模式配置,每次對每個引腳配置完成后都要調用GPIO初始化函數,代碼如下:
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init
展開 單片機串口最底層的本質!
GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* 第一步:初始化GPIO */
// 打開串口GPIO的時鐘
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
// 將USART Tx的GPIO配置為推挽復用模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
// 將USART Rx的GPIO配置為浮空輸入模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
/* 第二步:配置串口的初始化結構體 */
// 打開串口外設的時鐘
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
// 配置串口的工作參數
// 配置波特率
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
// 配置 針數據字長
USART_InitStructure.USART_WordLength
展開 如何獲取單片機程序運行時間?
= SET);
}
/* 關閉滴答定時器 */
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
檢驗Delay_us執行時間中用到的GPIO(gpio.h、gpio.c)的配置:
#ifndef __GPIO_H
#define __GPIO_H
#include "stm32f10x.h"
#define LOW 0
#define HIGH 1
/* 帶參宏,可以像內聯函數一樣使用 */
#define TX(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_Pin_0);\
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_0)
void GPIO_Config(void);
#endif
#include "gpio.h"
/**
* @brief 初始化GPIO
* @param 無
* @retval 無
*/
void GPIO_Config(void)
{
/*定義一個GPIO_InitTypeDef類型的結構體*/
GPIO_InitTypeDef GPIO_InitStructure;
/*開啟LED的外設時鐘*/
RCC_APB2PeriphClockCmd
展開 OM6625A 是一款針對藍牙低功耗(Bluetooth Low Energy)和專有 2.4GHz 無線應用的功耗SOC芯片
OM6625A集成最高64MHz高性能單片機,支持DMA、 GPIO 、SPI、UART、Timer、看門狗等功能,可支持32MHz外部晶體振蕩器,并集成多用途12bit ADC.
OM6625A芯片集成512K Flash、64K SRAM、256bit EFUSE ,支持用戶Keil IDE(注意:keil 建議安裝 5 5 .36 6 以上的版本);
OM6625A在線調試,可以用Jlink或Stlink的SWD模式,注意:在GPIO資源夠用的條件下,此調試口不要共用其他功能,SWCLK(GPIO00),SWDIO(GPIO01);
OM6625A量產燒錄是通過串口燒錄,需要5根線,VCC、GND、Boo(t GPIO4)、Uart_TX 、(GPIO5)和Uart_RX(GPIO6),需注意,只有GPIO4/5/6是下載口,在GPIO資源夠用的條件下,此下載口不要共用其他功能。
展開 學習STM32單片機,繞不開的串口
下面把串口實驗分成幾個關鍵的步驟:
1)串口通信使用到的GPIO引腳配置
STM32F103系列的芯片一般都有三個串口以上,用來調試使用的串口一般都是使用USART1。其他的串口配置都是一樣的。
下面這段就是串口配置的程序:
GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(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
串口使用的的GPIO口是PA9和PA10,所以只需配置這兩個IO口的輸入輸出模式就可以了。
展開 干貨|一個學妹寫的按鍵檢測函數把我秀翻了!
static void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 第1步:打開GPIO時鐘 */
__HAL_RCC_GPIOE_CLK_ENABLE();
/* 第2步:配置所有的按鍵GPIO為浮動輸入模式(實際上CPU復位后就是輸入狀態) */
GPIO_InitStructure.Mode = GPIO_MODE_INPUT; /* 設置輸入 */
GPIO_InitStructure.Pull = GPIO_NOPULL; /* 上下拉電阻不使能 */
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; /* GPIO速度等級 */
GPIO_InitStructure.Pin = GPIO_PIN_4;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
5.按鍵掃描
按鍵掃描函數KEY_Scan()每隔 10ms 被執行一次。RunPer10ms函數在 systick中斷服務程序中執行。
展開 干貨|高質量代碼是怎么寫出來的?串口環形隊列
();
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//使用中斷肯定要配置NVIC
HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
}
3.定義一個結構頭rt_ringbuffer 類型的變量ring_buf,變量名隨便取,阿貓阿狗都可以,只要你自己認得就行。
展開 
干貨|高質量代碼是怎么寫出來的?串口環形隊列
();
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//使用中斷肯定要配置NVIC
HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
}
3.定義一個結構頭rt_ringbuffer 類型的變量ring_buf,變量名隨便取,阿貓阿狗都可以,只要你自己認得就行。
展開 IP403參考資料和引腳圖
特性
支持串并聯雙LED驅動和GPIO控制器
串并聯LED驅動器
支持一個串行輸入56個并行led或三串行輸入16個并行ed為每個串行輸入。
支持4-16mA可調電流源驅動,無限流電阻
支持LED熄滅模式,實現省電功能
提供級聯能力,提供更多的LED驅動輸出。
串行輸入級支持18V至33V邏輯電平
芯和LED驅動器的單33V供電電壓
通用輸入輸出(GPIO)可以通過2線串行接口訪問嗎提供52個通用輸入或輸出
一般的描述
IP403是一個雙功能的控制器芯片,串行到并行的LED驅動器和GPIO控制器。串并聯LED驅動器最多可更換7個
g
GPIO控制器類似于常用的8255I/0控制器。此外,IP403提供了可編程的輸入穩定定時器,允許設計人員設置輸入反彈跳時間。IP403還為設計人員提供了靈活性,可以對單個輸入變化的中斷源進行編程。
當設置為LED驅動模式時,IP403可以直接驅動56個LED或48個LED,具體取決于單串行輸入或三串行輸入。如果設置為單串行輸入模式,所有LED驅動引腳都與內部移位寄存器連接在一起。如果設置為三路串行輸入模式,每條串行輸入對應16個LED驅動引腳,即總共48個LED驅動引腳。GPIO模式下提供52個GPIO。
展開 關注 | 一款革命性的Arm處理器
首先,GPIO[0]輸出引腳被切換一次,然后執行如圖2所示的三個測試。在第一個測試中,從ROM中讀取數據并將其添加到累加器中,并與期望值進行比較(見圖2a)。如果值匹配,將兩個脈沖的短脈沖發送到GPIO[0],如圖3a擴展數據所示。如果值不同,擴展數據圖3b中GPIO[0]上脈沖的周期和占空比會增加。在第二個測試中(圖2b),將數據寫入RAM,讀回并進行比較。如果數據在從RAM中寫入或讀取時沒有損壞,則3個脈沖的短脈沖發送到GPIO[0],如圖3a中的擴展數據所示。如果數據被破壞,GPIO[0]上脈沖的周期和占空比會像以前一樣增加。在最后的測試中(圖2c),處理器進入一個無限循環并測量GPIO輸入引腳[1]上應用'1'的時間。如果GPIO[1]保持在'1'而沒有任何故障,GPIO[0]從'0'變為'1'。PlasticARM的時鐘頻率為20khz。由于它不使用任何計時器,軟件中選擇了一個值來表示GPIO[1]信號在20khz工作時保持在'1'約1秒。在擴展數據圖3a的模擬中,該值對應于20,459個時鐘周期,在20 kHz時產生1.02295 s。
制造完成后,PlasticARM在晶圓探針臺上進行測試,同時仍連接到玻璃載體上。包括時鐘信號在內的輸入信號是使用Xilinx的ZC702 FPGA評估板在外部生成的。輸入和輸出信號都是使用Saleae Logic Pro 16邏輯分析儀捕獲的。測量在3 V和4.5 V下進行,具有不同的時鐘頻率。擴展數據圖4顯示了電源設置為3 V和時鐘頻率為20 kHz的實驗。ZC702 I/O電壓將輸入和輸出限制為2.5 V。測量數據波形顯示在擴展數據圖4a中,與擴展數據圖3a中所有三個測試的RTL仿真中的波形相匹配.PlasticARM在3 V時最高可達29 kHz,在4.5 V時最高可達40 kHz。
展開 推薦二輪電動車儀表盤藍牙主芯片方案-HS6621CGC
隨著國內二輪電動車的火熱開啟,電動車的智能化程度越來越高;電動車的智能操控需求也越來越高,現在介紹藍牙控制面板的一些功能;例如:定位(GNSS),設防,實時上報數據(CAT.1);終端支持藍牙OTA升級;BMS(藍牙數傳);一鍵啟動;藍牙鑰匙(藍牙APP解鎖,無感解鎖)等等功能,這些功能都可以依托OM6621CXC系列作為主控來控制實現以上功能;
現在介紹HS6621CGC系列的芯片功能;全功能藍牙5.1標準,兼容2.4G私有協議通信,支持BLE 4種數據速率(2Mbps/1Mbps/500Kbps/125Kbps);;支持廣播擴展功能(長包廣播包合37個廣播信道);實時數字RSSI輸出,精度為1dB; 內核ARM Cortex-M4F, max 64MHZ,SRAM:64KB,SFLASH:512K;豐富外設接口:豐富GPIO口,DMA,支持QSPI LCD,支持QSPI PSRAM,支持UART,I2S,I2C,Timer,RTC,WDT,QDEX,ADC,音頻ADC等等;
芯片特性:
? HS6621CG-C/CW-C支持多達32路GPIO
? HS6621CQ-C支持多達21路GPIO
? HS6621CM-C支持多達17路GPIO
? 支持8通道DMA
? 支持2路UART接口,其中一路兼容ISO7816
? 支持1路I2S接口
? 支持3路I2C接口
? 支持2路SPI接口
? 支持QSPI LCD/ AMOLED控制器
? 支持QSPI Flash控制器
? 支持3路Timer, 帶有4路比較/捕獲/PWM通道
? 支持RTC
? 支持看門狗
? 支持3路QDEC
GPADC
? HS6621CG-C/CW-C/CQ-C: 支持 8路單端差
分
展開