其实这只是开一个头,还没有什么实质内容,计划学习一些内容,STM32的定时器,据说:
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
http://www.360doc.com/content/11/0323/12/6139921_103814532.shtml
还是看书比看网页系统,竟然发现定时器是第13章,好嘛,一点一点来吧,先做流水灯,
另外一个发现,不用库确实麻烦,要查表找寄存器地址,其实有些写法也是库里拷过来的,好吧,先看库吧,
这要学习了基于库的工程建立,要有一个库,现在是3.5版本
1)建立工程,选择STM32F103RB,不要启动文件的说
2)复制库文件STM32F10x_StdPeriph_Driver到libraries文件夹 复制库文件Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\下的文件到libraries\CMSIS,复制Libraries\CMSIS\CM3\CoreSupport下的两个文件也到这里 Project\STM32F10x_StdPeriph_Template下的main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h四个文件拷贝到src文件夹
3)添加组sart_code放入文件\libraries\CMSIS\startup\arm\startup_stm32f10x_md.s 添加组src放入文件\src\main.c、src\stm32f10x_it.c 建立组libraries,选择性放入libraries\STM32F10x_StdPeriph_Driver\src里的文件,是否参加编译src\stm32f10x_conf.h来决定 建立组CMSIS放入文件\libraries\CMSIS\system_stm32f10x.c、libraries\CMSIS\core_cm3.c
4)Alt+F7或者Procject->Option for Target ‘…’,选择C/C++页Define USE_STDPERIPH_DRIVER, STM32F10X_MD Include path添加..\src、..\libraries\CMSIS、..\libraries\STM32F10x_StdPeriph_Driver\inc、..\libraries\STM32F10x_StdPeriph_Driver\src确认
做流水灯需要添加两个库文件到工程
stm32f10x_gpio.h
stm32f10x_rcc.h
然后建立两个文件led.c、led.h
根据神舟的定义改一下即可
led.c
#include "led.h" void LED_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3); GPIO_SetBits(GPIOB, GPIO_Pin_2); }
led.h
#ifndef __LED_H #define __LED_H #include "stm32f10x.h" #define ON 0 #define OFF 1 #define LED1(a) if (a) \ GPIO_SetBits(GPIOA,GPIO_Pin_2);\ else \ GPIO_ResetBits(GPIOA,GPIO_Pin_2) #define LED2(a) if (a) \ GPIO_SetBits(GPIOB,GPIO_Pin_2);\ else \ GPIO_ResetBits(GPIOB,GPIO_Pin_2) #define LED3(a) if (a) \ GPIO_SetBits(GPIOA,GPIO_Pin_3);\ else \ GPIO_ResetBits(GPIOA,GPIO_Pin_3) void LED_GPIO_Config(void); #endif /* __LED_H */
这个流水灯的延时还是通过空循环实现
#include "stm32f10x.h" #include "led.h" void Delay(__IO u32 nCount); int main(void) { LED_GPIO_Config(); while (1) { LED1( ON ); Delay(0x0FEFEF); LED1( OFF ); LED2( ON ); Delay(0x0FEFEF); LED2( OFF ); LED3( ON ); Delay(0x0FEFEF); LED3( OFF ); } } void Delay(__IO u32 nCount) { for(; nCount != 0; nCount--); }
有了前边烧录的基础,运行起来不是问题
初学C语言又遇到一个修饰词extern,继续百度,粗看大意如下
http://baike.baidu.com/link?url=euh4nexcjgGk46jptFsN3FMf8-Qg0wIMiIPm-_H8XyPm2cv4yque4Od40NqwHJqyLnNDCqa8wdjpNC3TwkeKJK
extern用在变量声明中常常有这样一个作用:你要在*.c文件中引用另一个文件中的一个全局的变量,那就应该放在*.h中用extern来声明这个全局变量。
这个关键字真的比较可恶,在定义(函数)的时候,这个extern居然可以被省略,所以会让你搞不清楚到底是声明还是定义,下面分变量和函数两类来说: 尤其是对于变量来说。
extern int a;//声明一个全局变量a
int a; //定义一个全局变量a
extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。
int a =0;//定义一个全局变量a,并给初值, 声明之后你不能直接使用这个变量,需要定义之后才能使用。
第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。 糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是int a;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次。 当你要引用一个全局变量的时候,你就要声明extern int a;这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。
有奖活动 | |
---|---|
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
【有奖活动】智能可穿戴设备AR/VR如何引领科技新潮流! | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! |
打赏帖 | |
---|---|
如何实现基于NXPiMX.RT1021的BH1730采集被打赏50分 | |
玩转“DFRobot盖革计数器模块”准备工作认识模块知识分享被打赏30分 | |
【换取手持数字示波器】AHT10温度检测分享被打赏40分 | |
【换取手持数字示波器】ACM32F070开发板点亮LCD屏和触控按键,串口,ADC被打赏40分 | |
【换取手持数字示波器】ACM32F070LCD屏和触控按键功驱动蜂鸣器分享被打赏40分 | |
【换取手持数字示波器】国民技术PWM功能知识分享被打赏40分 | |
【换取手持数字示波器】放大器运放知识分享被打赏40分 | |
【分享评测,赢取加热台】+开关电源AC输入知识分享被打赏30分 | |
【换取手持数字示波器】N32G430点亮数码管与串口打印、ADC被打赏40分 | |
老胖子聊电路--分析一个反馈电路被打赏50分 |