5]Interrupts*/
:
:
:
#endif/*STM32F10X_MD*/可能是定义中断向量的值吧
就写到这里,才发现自己做也许一个两个小时就能建好工程,但是要把写出来我却用了一个下午。
为了大家跟我都尽快学会STM32,我会努力学习将成果与大家分享;
2013年12月25日
第三章
STM32点亮第一个LED使用keilforARMMDK软件仿真
按照上一章建立的第一个工程模板,我们只需要在main函数里加入相关的点亮led灯的代码,并使用keil的软件仿真功能。
软件仿真在一定程度上可以在设计的初期发现程序的错误,减少我们下载到开发板的麻烦。
但是纯软件的仿真的正确,也不能保证程序就正确。
有时候仿真正确,实物却没这个效果。
有时软件仿真结果是错误,你分析你的程序却没错误。
遇到多了,经验也就出来,前几天我仿真一个STM32的Systick,仿真结果就不对,程序就是对的,我估计也许是软件本身的问题。
我建议用STM32+JLINK进行仿真,有个硬件平台结果的正确性就有保证。
1、Main.c函数代码:
#include"stm32f10x.h"
voiddelay(void)/**/
{
inti,j;
for(i=1000;i>0;i--)
for(j=1000;j>0;j--);
}
voidGPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
intmain(void)
{
GPIO_Config();
SystemInit();
while
(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);//点亮PB.5
delay();
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//熄灭PB.5
delay();
GPIO_SetBits(GPIOB,GPIO_Pin_6);//点亮PB.6
delay();
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//熄灭PB.6
delay();
}
}
2、代码分析:
GPIO_InitTypeDefGPIO_InitStructure;
定义一个结构变量GPIO_InitStructure,结构体类型为GPIO_InitTypeDef,相当于int
A;GPIO_InitTypeDef=intGPIO_InitStructure=A一样。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
开启GPIOB的时钟,要使用某个管脚都需要开启该管脚的时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
管脚号设置为第五脚和第六脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Speed_10MHz,
GPIO_Speed_2MHz,
GPIO_Speed_50MH
设置管脚电平翻转的速率,比如不要求快速变化一般10M,做串口的时候设置较高波 特率的话就使用50MHZ的。
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
设置输出为推挽输出。
它有8中工作模式,输出只有两种推挽和开漏输出。
其它可以参
考相关手册
GPIO_Init(GPIOB,&GPIO_InitStructure);
这一句就是将前面四句的设置初始化到GPIOB中;
SystemInit();将系统时钟设置为72M,不写这句,默认为8M;
GPIO_SetBits(GPIOB,GPIO_Pin_5);//点亮PB.5
delay();//延时
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//熄灭PB.5
delay();
GPIO_SetBits(GPIOB,GPIO_Pin_6);//点亮PB.6
delay();
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//熄灭PB.6
delay();
编译链接,然后开始软件仿真
3、软件仿真介绍:
1、编译连接好后,点击debug进入调试界面
2、调试窗口如下
3、
图片上加文字不好弄,大概就是复位、运行、停止、单步运行等我也不太熟悉,反正用到的时候试一试就知道了。
4、选择菜单栏上的peripherals按钮,选择generalpurposeI/O的GPIOB
5、点击左上角的运行按钮或者按F5键就可以看到GPIOB的5,6在一闪一闪的
6、顺便在看看波形仿真功能
点击下图的波形分析按钮
点击setup按钮会弹出一个窗口,在窗口的右上边,有个new的按钮,点击后
分别输入PORTB.5和PORTB.6
8、点击运行,将窗口调到合适的位置,最终波形图如下;
写得有些地方可能有错误,明天就要回四川了,有些急
2014年1月12日
第四章
串口的使用
1、为什么要用串口?
自上一篇写的时间是1月20号,今6月7号了,半年没更新了。
这半年发生了什么?
过完年就去找公司实习,在那里自我感觉进步很大。
其实在公司大多都是自学,师傅基本不会给你说什么。
但这并不能说明你的师傅对你不好,带我的那个师傅只比我高一届,但他的水平比我高的好多届。
他也是自学,也没人告诉他该怎么做,因为老板也不太懂。
所以自学能力很重要,当然有人带你的话,这样会更好。
不说这些了,串口在调试的时候作用非常大。
也学我们在学51的时候,只是将程序下载到开发板,看看是否能运行起来,通过数码管将结果显示出来,从而就知道程序设计的正确性。
以前我也是这样做的,没什么不好。
在公司实习的时候,他们调试都是使用串口打印输出信息,观察程序从上电、初始化、运行数据什么的全部都显示到PC机上。
然后再一句一句分析它的打印信息,从而找到出错的源头。
这使我对串口的认识有更深了一步,所以我决定在学习STM32的时候,开发流程跟在公司学的方法一样——使用串口,观察打印信息。
2、STM32跟PC机(也就是电脑)如何连接
我的STM32F103C8T6只是裸板,没有串口芯片,当然用的也是学生机——笔记本电脑,同样也没串口。
解决办法1、买一块MAX3232转接板+一条USB转串口线+邮费=30块左右
2、只需要买一块PL2303的USB转接板。
这样就将第一种的转接板和连接结合到一起了。
不过我用的是第一种,MAX3232+USB的串口线,为什么不用方便的2种?
max3232对于没有串口的开发板可以充当电平转换芯片,如何开发板有了电平转换芯片,我便使用USB转串口线经行连接,这样便灵活了。
第二种只是用在既没转换芯片也没USB转串口的情况,不过对于最小系统板来说,它既可以下载程序,又可以当做串口来调试。
至于台式机就不需要USB转串口线了,普通串口线即可。
连接示意如下所示:
3、代码分析
再写这里之前,应该已经学过模块化编程了,STM32的每个XXX.c和xxx.h这都是模块化编程。
良好的程序,与其好的代码风格有关。
你的代码风格跟你接触教你写代码的有很大关系。
以前刚刚学习单片机编程,我还不信,现在我承认,跟教我单片机的老师风格有些像。
这里我做的是一个串口发送数据到PC机的例子:
要让STM32能够顺利发出数据,要进行如下配置
PA9,PA10管脚要配置, USART也需要配置波特率,数据有几位,停止位,数据流等。
USART和uart有什么区别USART在做串口时,两者并不区别,但是USART有SPI的功能。
还有串口通信为什么要配置波特率,停止位,硬件数据留这些,以前我也没想过,现在只觉得协议这个东西,是一个好的标准。
建立一个usart_debug.c的文本,内容如下
#include"usart_debug.h"
voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能UASRT的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟,开始的时候,我没用这句话,调了两天,跟源码一句一句比才知道
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//波特率较高,IO翻转需较高频率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出;我看网上有人说设置成GPIO_Mode_Out_PP普通推挽输出也行,但实践出真知,我试了发送是乱码。
;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置成浮空输入,既然是输入所以就不用配置IO口的频率了
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
voidUSART1_config(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=115200;//配置波特率
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//配置数据位
USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位
USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶校验位
USART_InitStructure.USART_Hardware