【无标题】

实验1: STM32F103的流水灯点亮版本1(寄存器地址操作)

实验目的

了解STM32最小系统开发板的主要电路结构;
熟悉STM32单片机的GPIO输出功能;
设计STM32最小系统板LED流水灯实验原理图;
使用Proteus软件对原理图进行仿真,验证实验设计是否正确。

实验代码
在这里插入图片描述
在这里插入图片描述
#include “stm32f10x.h” // Device header
#include “Delay.h”

int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

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

while (1)
{
	GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001
	Delay_ms(1000);
	GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010
	Delay_ms(1000);
	GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100
	Delay_ms(1000);
	GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000
	Delay_ms(1000);
	GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000
	Delay_ms(1000);
	GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000
	Delay_ms(1000);
	GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000
	Delay_ms(1000);
	GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000
	Delay_ms(1000);
}

}

#include “stm32f10x.h”

/**

  • @brief 微秒级延时
  • @param xus 延时时长,范围:0~233015
  • @retval 无
    */
    void Delay_us(uint32_t xus)
    {
    SysTick->LOAD = 72 * xus; //设置定时器重装值
    SysTick->VAL = 0x00; //清空当前计数值
    SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
    while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
    SysTick->CTRL = 0x00000004; //关闭定时器
    }

/**

  • @brief 毫秒级延时
  • @param xms 延时时长,范围:0~4294967295
  • @retval 无
    */
    void Delay_ms(uint32_t xms)
    {
    while(xms–)
    {
    Delay_us(1000);
    }
    }

/**

  • @brief 秒级延时
  • @param xs 延时时长,范围:0~4294967295
  • @retval 无
    */
    void Delay_s(uint32_t xs)
    {
    while(xs–)
    {
    Delay_ms(1000);
    }
    }

// STM32标准库三种方式控制GPIO输出

	//第一种
	//GPIO_ResetBits函数GPIO_SetBits函数
    GPIO_ResetBits(GPIOA, GPIO_Pin_7);
    GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	Delay_ms(500);
	GPIO_SetBits(GPIOA, GPIO_Pin_0);
	Delay_ms(500);
	
	//第二种
    GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_SET);
	OLED_ShowNum(2, 9, 5, 2);
	//GPIO_WriteBit函数
	GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
	Delay_ms(500);
	GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
	Delay_ms(500);
	
	//第三种
    GPIO_Write(GPIOA,~0x00080);
	//GPIO_WriteBit函数使用转换类型控制GPIO输出

	GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
	Delay_ms(500);
	GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
	Delay_ms(500);

/*
总的来说,GPIO_ResetBits/GPIO_SetBits方式效率最高,
GPIO_WriteBit以数字设置电平方式最简洁,
GPIO_WriteBit单独设置引脚方式灵活性最好,
可以选择合适自身需求的方式进行GPIO输出控制
*/

利用proteus进行仿真
在这里插入图片描述将编译后生产的hex文件插入并配置合适的晶振频率:
在这里插入图片描述
出来的结果如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值