ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

嵌入式系统——基于Keil5的STM32固件库寄存器编程实现流水灯

2021-05-20 20:33:19  阅读:236  来源: 互联网

标签:unsigned long rGPIOF STM32 volatile rGPIOE Keil5 固件 define


//PF9-LED0,PF10-LED1
//PF13-LED2,PF14-LED3
#define rRCCAHB1CLKEN *((volatile unsigned long *) 0x40023830) 

#define rGPIOF_MODER *((volatile unsigned long *) 0x40021400)
#define rGPIOE_MODER *((volatile unsigned long *) 0x40021000)
	
#define rGPIOF_OTYPER *((volatile unsigned long *) 0x40021404)
#define rGPIOE_OTYPER *((volatile unsigned long *) 0x40021004)

#define rGPIOF_OSPEEDR *((volatile unsigned long *) 0x40021408)
#define rGPIOE_OSPEEDR *((volatile unsigned long *) 0x40021008)

#define rGPIOF_PUPDR *((volatile unsigned long *) 0x4002140C)
#define rGPIOE_PUPDR *((volatile unsigned long *) 0x4002100C)

#define rGPIOF_ODR *((volatile unsigned long *) 0x40021414)
#define rGPIOE_ODR *((volatile unsigned long *) 0x40021014)

#define time 0x300000
#define on 1
#define off 0
void led_init(){
	//GPIOE -- rRCCAHB1CLKEN[4]   GPIOF -- rRCCAHB1CLKEN[5]
	rRCCAHB1CLKEN |= (1<<4)|(1<<5);
	
	//MODER-OUT--01 PF9,PF10 [21:18]<------- 0101
	unsigned long r_value;
	r_value = rGPIOF_MODER;//read
	r_value &= ~(0xf << 18);//clear
	r_value |= (1 << 18)|(1 << 20);
	rGPIOF_MODER = r_value;//write
	
	//MODER-OUT--01 PF13,PF14 [29:26]<------- 0101
	r_value = rGPIOE_MODER;//read
	r_value &= ~(0xf << 26);//clear
	r_value |= (1 << 26)|(1 << 28);
	rGPIOE_MODER = r_value;//write
	
	//OTYPER-PP--0 PF9,PF10 [10:9]<--------00
	r_value = rGPIOF_OTYPER;//read
	r_value &= ~(0x3 << 9);//clear
	rGPIOF_OTYPER = r_value;//write
	
	//OTYPER-PP--0 PF13,PF14 [14:13]<--------00
	r_value = rGPIOE_OTYPER;//read
	r_value &= ~(0x3 << 13);//clear
	rGPIOE_OTYPER = r_value;//write
	
	//OSPEEDR- PF9,PF10 [21:18]<-------1010
	r_value = rGPIOF_OSPEEDR;//read
	r_value &= ~(0xf << 18);//clear
	r_value |= (1 << 19)|(1 << 21);
	rGPIOF_OSPEEDR = r_value;//write
	
	//OSPEEDR- PF13,PF14 [29:26]<-------1010
	r_value = rGPIOE_OSPEEDR;//read
	r_value &= ~(0xf << 26);//clear
	r_value |= (1 << 27)|(1 << 29);
	rGPIOE_OSPEEDR = r_value;//write
	
	//PUPDR PF9,PF10 [21:18]<--------0000
	r_value = rGPIOF_PUPDR;//read
	r_value &= ~(0xf << 18);//clear
	rGPIOF_PUPDR = r_value;//write
	
	//PUPDR PF13,PF14 [29:26]<--------0000
	r_value = rGPIOE_PUPDR;//read
	r_value &= ~(0xf << 26);//clear
	rGPIOE_PUPDR = r_value;//write
	
	//ODR PF9,PF10 [10:9]<-------11
	r_value = rGPIOF_ODR;//read
	r_value |= (1<<9)|(1<<10);//clear
	rGPIOF_ODR = r_value;//write
	
	//ODR PF13,PF14 [14:13]<-------11
	r_value = rGPIOE_ODR;//read
	r_value |= (1<<13)|(1<<14);//clear
	rGPIOE_ODR = r_value;//write
}

void led0_ctr(int is_on){
	unsigned long r_value;
	r_value = rGPIOF_ODR;
	r_value |= (1<<9);//clear
	if(is_on) r_value &= ~(1<<9);
	rGPIOF_ODR = r_value;
}

void led1_ctr(int is_on){
	unsigned long r_value;
	r_value = rGPIOF_ODR;
	r_value |= (1<<10);//clear
	if(is_on) r_value &= ~(1<<10);
	rGPIOF_ODR = r_value;
}

void led2_ctr(int is_on){
	unsigned long r_value;
	r_value = rGPIOE_ODR;
	r_value |= (1<<13);//clear
	if(is_on) r_value &= ~(1<<13);
	rGPIOE_ODR = r_value;
}

void led3_ctr(int is_on){
	unsigned long r_value;
	r_value = rGPIOE_ODR;
	r_value |= (1<<14);//clear
	if(is_on) r_value &= ~(1<<14);
	rGPIOE_ODR = r_value;
}

void ledAll_ctr1(int flag){
	unsigned long r_value;
	if(flag == 0){//LED0 off, LED1 off, LED2 off, LED3 off
		led0_ctr(off);
		led1_ctr(off);
		led2_ctr(off);
		led3_ctr(off);
	}
	if(flag == 1){//LED0 on, LED1 off, LED2 off, LED3 off
		led0_ctr(on);
		led1_ctr(off);
		led2_ctr(off);
		led3_ctr(off);
	}
	else if(flag == 2){//LED0 on, LED1 on, LED2 off, LED3 off
		led0_ctr(on);
		led1_ctr(on);
		led2_ctr(off);
		led3_ctr(off);
	}
	else if(flag == 3){//LED0 on, LED1 on, LED2 on, LED3 off
		led0_ctr(on);
		led1_ctr(on);
		led2_ctr(on);
		led3_ctr(off);
	}
	else if(flag == 4){//LED0 on, LED1 on, LED2 on, LED3 on
		led0_ctr(on);
		led1_ctr(on);
		led2_ctr(on);
		led3_ctr(on);
	}
}

void delay(int v){
	while(v--);
}

int main(){
	led_init();
	unsigned int flag = 0;
	while(1){
		for (int i=0;i<5;i++){
			ledAll_ctr1(i);
			delay(time);
		}
		for (int i=3;i>=0;i--){
			ledAll_ctr1(i);
			delay(time);
		}
	}
}

标签:unsigned,long,rGPIOF,STM32,volatile,rGPIOE,Keil5,固件,define
来源: https://www.cnblogs.com/wsl-lld/p/14791323.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有