永发信息网

STM32对GPIO操作一般用库函数,我想知道怎样用位操作实现流水灯?谢谢了!

答案:4  悬赏:80  手机版
解决时间 2021-11-19 14:20
STM32对GPIO操作一般用库函数,我想知道怎样用位操作实现流水灯?谢谢了!
最佳答案
位带区中的地址除了可以同RAM一样使用外,还带有自己的“位带别名”。将每个位拓展为32位的字,既成了位带别名。
如:0x20000000(一个字节)拓展到32位可得8个32位的字分别是:
0x22000000 0x22000004 0x22000008 0x2200000c
0x22000010 0x22000014 0x22000018 0x2200001c
由此可得“位带区” 上任意地址的 “位带别名地址”
SRAM : 0x22000000 +((A‐0x20000000)*8+n)*4
FLASH : 0x42000000 +((A‐0x40000000)*8+n)*4
既 :
0x22000000+ (A‐0x20000000)*32 + n*4
0x42000000+ (A‐0x40000000)*32 + n*4
别名区地址 = 位带别名区起始地址+偏移量
备注 : 字节的地址: A
位序号 : n (0例 : 0x22000000 + ((0x20000000 - 0x20000000 )*8+4)*4 = 0x22000010
既 : 0x20000000第4位带别名区地址
"位带地址+位序号" 转换别名地址
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808

#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))//计算bit区地址偏移
#define MEM_ADDR(addr) (*((vu32 *)(addr) )) //强制转换为指针
#define BIT_ADDR(addr, bitnum) MEM_ADDR( BITBAND(addr, bitnum) )
再来一个宏重命名一下
#define PA0 BIT_ADDR(GPIOA_ODR_Addr, 0)
全部回答
for(i=0;i<8;i++)
GPIO_SetBits(GPIOE,(1<好像这样能够,但我也不知怎么回事
GPIO_InitTypeDef GPIO_InitStructure;
#define LED1_ON GPIO_SetBits(GPIOB, GPIO_Pin_5);
#define LED1_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_5);
#define LED2_ON GPIO_SetBits(GPIOD, GPIO_Pin_6);
#define LED2_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_6);
#define LED3_ON GPIO_SetBits(GPIOD, GPIO_Pin_3);
#define LED3_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_3);
#define KEY1 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5);
void RCC_Configuration(void);
void LED_Config(void);
void Delay(__IO uint32_t nCount);

void LED_Config(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1 V6 //将V6,V7,V8 配置为通用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3; //LED2, LED3 V7 V8
// GPIO_Init(GPIOD, &GPIO_InitStructure);
}

int main(void)
{
RCC_Configuration(); //系统时钟配置
LED_Config();//LED控制配置
while (1)
{
LED1_ON

Delay(0xFFFFF);
LED1_OFF;

Delay(0xAFFFF);

}
}
GPIO功能文件相关操作:
使用GPIO功能前,首先要初始化系统,最简单的方法为:添加stm32f10x_rcc.c,打开stm32f10x_conf.h 在第41行将两边注释符去掉,在main函数中添加代码SystemInit();
添加stm32f10x_gpio.c
打开stm32f10x_conf.h 在37行将两边注释符去掉
GPIO口使能:
1.定义一个初始化类型结构体变量,我们为这个结构体里的各个变量赋值,
GPIO_InitTypeDef GPIO_InitStructure;
2. 开启GPIO时钟,只有开启了GPIO时钟,对应端口才可以正常工作,GPIO口对应时钟APB2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
3. 为结构体赋值
设置GPIO口为输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //设置引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出,其它选项
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出最大频率,其它选项

设置GPIO口为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //设置引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//悬空输

附:
GPIO_Mode值
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出

GPIO_Speed值
GPIO_Speed_10MHz 最高输出速率 10MHz
GPIO_Speed_2MHz 最高输出速率 2MHz
GPIO_Speed_50MHz 最高输出速率 50MHz

4. 使能GPIO口
GPIO_Init(GPIOA, &GPIO_InitStructure);

例:
void GPIOA0_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

GPIO使用:
输出状态:
GPIO口置高:GPIO_SetBits(GPIOA,GPIO_Pin_0| GPIO_Pin_1);
GPIO口置底:GPIO_ResetBits(GPIOA,GPIO_Pin_0);
写数据到GPIO的某个引脚:GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);
写数据到GPIO:GPIO_Write(GPIOA, 0x1101);
得到GPIO口状态:GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0);

u16 ReadValue;
ReadValue = GPIO_ReadOutputData(GPIOC);

例:
#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_0)
#define LED0_ON GPIO_SetBits(GPIOA,GPIO_Pin_0)
#define LED0 GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)
int main(void)
{
while(1)
{
delay();
if(LED1)
LED0_OFF;
else LED0_ON;
}
}

输入状态:
得到GPIO口状态:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)

u16 ReadValue;
ReadValue = GPIO_ReadInputData(GPIOC);

这是GPIO的基本配置方法
实现走马灯 按照你自己的板子上小灯连接的对应引脚将里面的引脚换下就好了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
车享家汽车服务中心地址在什么地方,我要处理
梦见尖嘴怪鸟,感觉挺吓人的
有谁知道1953年农历冬月二十九是阳历几月几日
甘肃酒泉怎么到天津?麻烦查一下
柞,这个字怎么读?
求推荐深圳PCB老师,想学PCB设计
阳泉市郊区荫营镇三都幼儿园地址在什么地方,
次数原则是指对对于某事物做出判断的分界点
宝悦酒店停车场(木兰路与龙仙路交叉口东50米
在头文字D中拓海他老爸开的那辆斯巴鲁是什么
比如《天马》一文作者按什么顺序写的
主角与配角,白云黑土系列.谁更好更经典
阳泉市郊区义井白羊墅幼儿园地址好找么,我有
狐栗塘地址在什么地方,想过去办事
阳泉市郊区河底联校牵牛镇幼儿园地址好找么,
推荐资讯
重庆涪陵墨香苑培训学校地址在什么地方,想过
海信电视好吗
蜡笔小新家是住哪里?
地理的温度600k是什么意思
瑞星家园怎么样?好不好?值不值得买?
想知道: 湖州市 从旧馆镇到安吉县上墅私立高
角旁边一个斗怎么读
g76是什么高速公路1700公里是那里
— Andy,     your mother     the
阳光开锁(柏叶中路284号附近阳光开锁)地址好
一千多年来,木兰的形象一直受人们喜爱,为什么
石排在广东那里
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?