Proteus仿真STM32F103R6的寄存器版跑馬燈程序

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);
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章