STM32最小系统核心板(STM32F103C8T6)实现流水灯

目录

实验准备

使用寄存器方式

搭建程序

搭建电路

亮灯

STM32CubeMX生成代码

下载

调试

亮灯 


本次实验,我们来做一个流水灯实验。听说这是个很有趣的东西。

实验准备

        准备阶段,我们要准备STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED灯,然后要准备一些驱动,这里我直接偷懒,用好朋友的U盘转来的,这样下载就不用那么久了。这里是需要mcuisp和startup。

使用寄存器方式

搭建程序

       首先进入上期提到的keil软件,选择头上的project,新建一个μVersion project,这里我给他取名叫LED,然后如下图选择即可。再下一个界面就不能像上期一样勾选了,我们要先选中CMSIS里面的core,勾选后方5.4.0,接着选中device里面的startup,检查后方1.0.0的不勾选。然后就可以ok了。

 

         看到这里的这个键,点开,设置output,选择create hex file,

         选择左侧source group,右击创建led.c

         在项目中写下如下代码,这里选择的三个点是PA4,PB9,PC15。


#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800

#define RCC_APB2ENR (*(unsigned int *)0x40021018)

#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)

#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
	


void SystemInit(void);
void Delay_ms(volatile  unsigned  int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}

void A_LED_LIGHT(){
	GPIOA_ODR=0x0<<4;		//PA4低电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x1<<15;		//PC15高电平
}
void B_LED_LIGHT(){
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x0<<9;		//PB9低电平
	GPIOC_ODR=0x1<<15;		//PC15高电平
}
void C_LED_LIGHT(){
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x0<<15;		//PC15低电平	
}

int main(){
	int j=100;
	// 开启时钟
	RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
	RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
	RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
	
	
	// 设置 GPIO 为推挽输出
	GPIOB_CRH&= 0xffffff0f;	//设置位 清零		
	GPIOB_CRH|=0x00000020;  //PB9推挽输出

	GPIOC_CRH &= 0x0fffffff; //设置位 清零		
	GPIOC_CRH|=0x30000000;  //PC15推挽输出


	GPIOA_CRL &= 0xfff0ffff; //设置位 清零		
	GPIOA_CRL|=0x00010000; //PA4推挽输出

	// 3个LED初始化为不亮(即高点位)
	GPIOB_ODR |= (1<<9); 
	GPIOC_ODR |= (1<<15); 
	GPIOA_ODR |= (1<<4);  
	
	while(j){
		
		B_LED_LIGHT();
		Delay_ms(1000000);

		C_LED_LIGHT();
		Delay_ms(1000000);

		A_LED_LIGHT();
		Delay_ms(1000000);
	}
	
}


void SystemInit(){
	
}

         这里注意,我们需要一个驱动,这个驱动要和我们的led.c在同一个目录下。(如果放在了其他地方可以把他复制过去)接着选择左侧source group1右击文件夹,选择Add Existing Files to Group Source Group 1,文件类型改为All FIles,选择刚刚添加的启动文件,add之后close。

        现在就可以回来编译了。

搭建电路

        拿出我们准备的那些工具开始连接电路板。

        首先把灯装上去。以面对自己的那边为准插入三个灯灯,注意长头在最外侧,短头在第三排。然后接一根白线,如图所示。

         接下来把芯片黄头朝左,右边3.3的位置和白线的位置平行,针在以蓝色线为基准第三排整体插入,然后把黄色部分上方的那个摘下来放右边。这里注意:一要小心,二要把下面针部分完全插进去,不然容易出问题。

         因为我们这里是红色B9,绿色C15,黄色A4,所以使用电线将这些一一连接起来,这里注意在中间同一边的,只要是同一竖排一般都是等价的,可以不用太刻意位置。

         接下来准备我们的接口,我这里使用的是USB的头,把自带的电线接成这样进行准备。

 

         接着从上往下数,1.4接在芯片右侧的1.4头,2.3分别用电线接在芯片的A9.A10的位置,电路板就接好了。

 

亮灯

         这里直接打开mcuisp,选择dtr低电平rts高电平,程序文件选择之前编译成功的hex文件,先读器件信息,成功之后开始编程。待到下方绿色进度条加载满了之后,把电路板从电脑上取下来,把之前黄色的那个东西还原,再把电路接回电脑,他就成功了(理论上)。 

STM32CubeMX生成代码

下载

        首先前往stm官网下载一个stm32cubemx,下载解压完成之后开始安装,安装途中有需要选项的部分这里指引一下,没有出现指引的地方就直接next就可以了。

STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics

         安装完成之后打开。在help帮助里面manage那个,下载HAL库。

 

调试

         下载完成之后,回到主界面,新建项目。选择stm32f103c8,进入以下界面。 

 

         点击system core,进入SYS,在debug下选择serial wire。

        选择上方clock configuration,找到pllclk勾选

        然后回到pinout那里,找到rcc,把第一排的hse改为如图。

         找到gpio,把我们要用的三个口(PA4,PB9,PC15)设置为output

 点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM。

选择左侧code generator,勾选第二栏第一项,后面点击generate code,选择open project。

亮灯 

        接下来就是keil界面,打开左侧第二个文件夹,打开main.c,找到里面的main部分,改为如下内容,然后编译。

int main(void)
{
  SystemClock_Config();//???????
  MX_GPIO_Init();//gpio???
  while (1)
  {		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4??
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9??
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15??
		HAL_Delay(1000);//??1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4??
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9??
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15??
		HAL_Delay(1000);//??1s		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4??
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9??
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15??
		HAL_Delay(1000);//??1s
	}

  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 这里再次把那个黄色的玩意置右,连接电脑。

再次打开mcuisp,更改hex文件路径,然后如寄存器方式运行。

 

成了! 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值