Proteus仿真STM32F103R6的寄存器版跑马灯程序

   日期:2021-01-18     浏览:256    评论:0    
核心提示:STM32最简单的外设莫过于IO口的高低电平控制了, Proteus仿真STM32F103R6的跑马灯程序。一、原理图二、跑马灯C程序// 粗略延时函数static void delay(unsigned int n){ for(unsigned int i=0; i<n; i++) { for(unsigned int j=0; j<1024; j++) { for(unsigned int k=0; k<1024; k++) { _

STM32最简单的外设莫过于IO口的高低电平控制了, Proteus仿真STM32F103R6的跑马灯程序。

一、原理图

二、跑马灯C程序

// 粗略延时函数
static void delay(unsigned int n)
{
	for(unsigned int i=0; i<n; i++)
	{
		for(unsigned int j=0; j<1024; j++)
		{
			for(unsigned int k=0; k<1024; k++)
			{
				__asm("nop");
			}
		}
	}
}
int main(void)
{
	// 使能GPIOB端口时钟
	// RCC起始地址:0x40021000
	// RCC_APB2ENR偏移地址:0x18
	*(unsigned int *)(0x40021000 + 0x18) |= (1 << 3);
	
	// 配置IO口为输出模式
	// CNFy[1:0]: 00 - 通用推挽输出模式
	// MODEy[1:0]:01 - 输出模式,最大速度10MHz
	for(unsigned int i=0; i<8; i++)
	{
		// GPIOB起始地址:0x40010C00
		// GPIOx_CRL偏移地址:0x00
		*(unsigned int *)(0x40010C00 + 0x00) |= (1 << (4*i+0));
		*(unsigned int *)(0x40010C00 + 0x00) &= ~(1 << (4*i+1));
		*(unsigned int *)(0x40010C00 + 0x00) &= ~(1 << (4*i+2));
		*(unsigned int *)(0x40010C00 + 0x00) &= ~(1 << (4*i+3));
	}

	// 设置IO口为高电平,关闭LED灯
	// GPIOB起始地址:0x40010C00
	// GPIOx_ODR地址偏移:0x0C
	*(unsigned int *)(0x40010C00 + 0x0C) |= 0xFF;

	while(1)
	{
		for(unsigned int i=0; i<8; i++)
		{
			// 设置IO口为低电平,打开LED灯
			// GPIOB起始地址:0x40010C00
			// GPIOx_ODR地址偏移:0x0C
			*(unsigned int *)(0x40010C00 + 0x0C) &= ~(1 << i);
			delay(1);
			
			// 设置IO口为高电平,关闭LED灯
			// GPIOB起始地址:0x40010C00
			// GPIOx_ODR地址偏移:0x0C
			*(unsigned int *)(0x40010C00 + 0x0C) |= (1 << i);
			delay(1);
		}
	}
}

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服