- /*----------------2、获取端口GPIOx(A-E)的对应寄存器的某一操作位的位地址-------------------*/
- // #define BitBand(Addr , BitNum) *( (volatile unsigned long *)(Addr & 0xf0000000) + 0x2000000 + ((Addr&0xfffff)*32) + (BitNum*4) )
- // 因为 左移、右移 语句的执行速度比乘除法语句的运动速度快,所以将上述语句改成如下方式
- #define BitBand(Addr , BitNum) *( (volatile unsigned long *)( (Addr & 0xf0000000) + 0x2000000 + ((Addr&0xfffff)<<5) + (BitNum<<2) ) )
-
- /*----------------3、宏定义函数,对固定的位绑定 进行功能封装------------------------------*/
- #define PAout(n) BitBand(GPIOA_ODR , n)
- #define PAin(n) BitBand(GPIOA_IDR , n)
-
- #define PBout(n) BitBand(GPIOB_ODR , n)
- #define PBin(n) BitBand(GPIOB_IDR , n)
-
- #define PCout(n) BitBand(GPIOC_ODR , n)
- #define PCin(n) BitBand(GPIOC_IDR , n)
-
- #define PDout(n) BitBand(GPIOD_ODR , n)
- #define PDin(n) BitBand(GPIOD_IDR , n)
-
- #define PEout(n) BitBand(GPIOE_ODR , n)
- #define PEin(n) BitBand(GPIOE_IDR , n)
-
-
-
- /* Private functions -----------------------------------------------------------------------------*/
- /**************************************************************************************************
- * Function Name : main
- * Description : 从GPIOA.8-.16输入一个电平信号,GPIOA.0-.7口分别将对应引脚输入的电平信号输出
- * Input : None
- * Output : None
- * Return : None
- ****************************************************************************************************/
- int main(void)
- {
-
- /*--------控制STM32引脚GPIOA.0 GPIOA.1推挽输出高电平--------*/
- //1、设置GPIOA的引脚的工作模式,即配置寄存器GPIOA_CRL 、 GPIOA_CRH
- //GPIOA.0-.7推挽输出,速度50MHZ , GPIOA.8-.16浮空输入
- GPIOA->CRL = 0x33333333 ; // CNF0 = 00 MODE0 = 11
- GPIOA->CRH = 0x44444444 ; // CNF0 = 01 MODE0 = 00
-
- //2、配置寄存器GPIOA_ODR、GPIOA_IDR ,实现GPIOA.0输出 跟随 GPIOA.8的输入
- while(1)
- {
- /*----------------------第0位----------------------*/
- if( PAin(8) == 1) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
- {
- PAout(0) = 1 ; //对寄存器GPIOA->ODR的第0位置一
- }
- else
- {
- PAout(0) = 0 ; //对寄存器GPIOA->ODR的第0位清零
- }
- /*----------------------第1位----------------------*/
- if( PAin(9) == 1) //寄存器GPIOA->IDR的第9位为1,表示从在GPIOA.9口输入了高电平
- {
- PAout(1) = 1 ; //对寄存器GPIOA->ODR的第1位置一
- }
- else
- {
- PAout(1) = 0 ; //对寄存器GPIOA->ODR的第1位清零
- }
- /*----------------------第2位----------------------*/
- if( PAin(10) == 1) //寄存器GPIOA->IDR的第10位为1,表示从在GPIOA.10口输入了高电平
- {
- PAout(2) = 1 ; //对寄存器GPIOA->ODR的第2位置一
- }
- else
- {
- PAout(2) = 0 ; //对寄存器GPIOA->ODR的第2位清零
- }
- /*----------------------第3位----------------------*/
- if( PAin(11) == 1) //寄存器GPIOA->IDR的第11位为1,表示从在GPIOA.11口输入了高电平
- {
- PAout(3) = 1 ; //对寄存器GPIOA->ODR的第3位置一
- }
- else
- {
- PAout(3) = 0 ; //对寄存器GPIOA->ODR的第3位清零
- }
- /*----------------------第4位----------------------*/
- if( PAin(12) == 1) //寄存器GPIOA->IDR的第12位为1,表示从在GPIOA.12口输入了高电平
- {
- PAout(4) = 1 ; //对寄存器GPIOA->ODR的第4位置一
- }
- else
- {
- PAout(4) = 0 ; //对寄存器GPIOA->ODR的第4位清零
- }
- /*----------------------第5位----------------------*/
- if( PAin(13) == 1) //寄存器GPIOA->IDR的第13位为1,表示从在GPIOA.13口输入了高电平
- {
- PAout(5) = 1 ; //对寄存器GPIOA->ODR的第5位置一
- }
- else
- {
- PAout(5) = 0 ; //对寄存器GPIOA->ODR的第5位清零
- }
- /*----------------------第6位----------------------*/
- if( PAin(14) == 1) //寄存器GPIOA->IDR的第14位为1,表示从在GPIOA.14口输入了高电平
- {
- PAout(6) = 1 ; //对寄存器GPIOA->ODR的第6位置一
- }
- else
- {
- PAout(6) = 0 ; //对寄存器GPIOA->ODR的第6位清零
- }
- /*----------------------第7位----------------------*/
- if( PAin(15) == 1) //寄存器GPIOA->IDR的第15位为1,表示从在GPIOA.15口输入了高电平
- {
- PAout(7) = 1 ; //对寄存器GPIOA->ODR的第7位置一
- }
- else
- {
- PAout(7) = 0 ; //对寄存器GPIOA->ODR的第7位清零
- }
-
- }
-
- return 1 ;
- }
|