一、工程的建立和流水灯的实现

笔者最近准备蓝桥杯,因而写一些心得和赛友等其它朋友共同探讨比赛,因为先前用过一段时间的stm32f10xzet6所以有点基础(捂脸),欢迎大家指出我的错误、共同进步(握爪)下面就从最基础的建工程和第一个——流水灯的实现。

1.建立工程

如图,在考场的电脑上面基本上会提供3.5版本的固件库,还有lcd的驱动程序以及该实验所要用的代码;有人说直接在已经写好的lcd上修改不就不用建工程了吗,其实不然;那是一种方法,但是如果你熟悉建工程其实费不了你多长时间的,相反,如果老师发现你的工程是自己建的怎么着改卷印象分也会高点的(这小伙子连工程都会建,不错,加一点分)。

①、新建一个文件夹,一般不建议建在桌面上,万一电脑死机,重启那么就悲剧了(考场的电脑一般开机会自动清除c盘等的文件),问一下老师哪个盘不会清空会好一点。比如第一个我们要写的是流水灯,文件夹命名流水灯,接着在该文件内建立四个文件夹分别命名CORE、FWLIB、USER、OUTPUT;并分别将固件库里面的如图所示的文件复制进去。(记住最好是复制,因为如果在同一盘上系统默认是移动,即将固件库文件移动到新建文件夹内,固件库不完整如果第一个工程崩了的话就在固件库找不到相对应的文件了)

注:startup_stm32f10x_md.s因为stm32f103rbt6是128kbflash的 所以选择_md.s如果是zet6则是_hd.s

至此准备工作完成(OUTPUT为文件输出所以不需要加东西)

②、接着打开keil4(keil5同理)点击projec -new uvision project选择刚刚建立的文件夹的user文件名命名流水灯目录下;

接下来弹出的处理器对话框选择STM32F103RB

这个是询问是否复制文件到文件夹内因为我们已经先前准备好了所以选择否。

③、接下来进行配置

如图建立然后将各个文件夹的文件添加进去。

 

 

 

至此工程已经建立完毕接下来开始写程序

2、流水灯程序

#include "stm32f10x.h"
#include <stdio.h>

void Led_Init(void);

int main(void)
{
 u32 i;
 Led_Init (); 	 
  
  
 	
  while (1)
  {
    
  GPIO_SetBits(GPIOC,GPIO_Pin_8);
  GPIO_ResetBits(GPIOC,GPIO_Pin_9);
  GPIO_SetBits(GPIOD,GPIO_Pin_2);
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);

  for(i=10000000;i>0;i--);
 
  GPIO_SetBits(GPIOC,GPIO_Pin_9);
  GPIO_ResetBits(GPIOC,GPIO_Pin_8);
  GPIO_SetBits(GPIOD,GPIO_Pin_2);
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);
 
  for(i=10000000;i>0;i--);

  GPIO_ResetBits(GPIOD,GPIO_Pin_2);
  }
}

 void Led_Init(void)
 {
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


 
  GPIO_Init(GPIOC, &GPIO_InitStructure);


 }

		

代码没什么好讲的,学过c语言的都能看得懂其中for(i=10000000;i>0;i--);是延时函数,但注意这个只是让cup在做无谓的计算延时的时间跟cpu状态等其它因素有关因而并不是准确延时,systick定时器rtc等之后的内容才是准确时间。

3、分析代码:

 

由ct117e的电路原理图可以看出led 先和锁存器M74HC573M1R相连,再通过网络线和CON40S
相连从而间接与mcu相连即led1-led8对应mcu pc8-pc15,同理锁存器N_LE对应pd2;因而在控制led亮灭时要先开启锁存器(置高电位)然后置低led对应引脚(led为共阳极)即可点亮;在这里要注意的是锁存器的使用

“锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态 锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。 锁存器不同于触发器,它不在锁存数据时,输出端的信号随输入信号变化,就像信号通过一个缓冲器一样;一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用。锁存器也称为透明锁存器,指的是不锁存时输出对于输入是透明的。”这段话是锁存器的定义,即当置高锁存器状态得以更新,置低则状态锁定,于是乎,可以形象的理解为先准备好进屋(将led引脚配置好,高灭低亮,这里选择led1灭led2亮)然后开锁(置高锁存器引脚)然后关门上锁(置低锁存器);并且延时一段时间,接着重复上述过程不过是led1亮,led2灭,这样从效果上看实现了流水的功能(两个灯交替闪烁)。

4.烧录

因为coocox自身的问题我们的先关闭工程然后再打开编译无error,烧录

便可以在开发板上看到效果了,至此第一个程序完成。

发布了48 篇原创文章 · 获赞 129 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qqGHJ/article/details/86501727