主要使用的是103和407系列的32
不知不觉转眼大二也过了一半了,总是想说要开始学32,学32,却一直没有正真的系统的去开始学32。到了寒假,有了许多可以自己调配的时间, 学了一个多礼拜,大致学到了定时器,输出pwm左右,也实战了一下。之前没学32之前一直以为用32做东西不算什么本事,以为只是调用调用库,哪有51更加底层,更加清楚。学了之后才发现,果断被打脸了。51虽说经典,但是32确实强大。 用32写程序不只是调用库那么简单,要了解32各个函数成员的意义,每个模式的作用........(当然也可以直接copy例程的一个一个的代码块,可以不理解直接用函数接口,但是不建议这样,因为这样永远不能直接做东西) 。
其实之所以难上手是因为32内部的中断,定时器,寄存器相较于51多了太多太多,所以为了管理这些东西,会有很多的接口, 很多的定义,很多的设置和模式需要自己去判断...... 想想第一次用j-link烧程序的时候都是历经挫折
本菜鸟接下来来说一下点亮led和流水灯的一些关键点:1. 32不同于51端口不需要进行任何配置就可以用,32因为功能较51强大很多正是体现在这些东西,32初始化需要调用xxx_gpio.h里
的GPIO_InitTypeDef,这是一个结构体,内部的成员有如图:
可以看到里面3个成员,如果是stm32f407的,这里面的 GPIO_Mode还要细分成几个模式
2.GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct),初始化函数,把配置好的端口通过这个函数送入里面初始化,IO口就初始化好了
一言不合上代码:
#include "stm32f10x.h" #define digitalHi(p,i) {p->BSRR=i;} //设置为高电平 #define digitalLo(p,i) {p->BRR=i;} //输出低电平 #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态 void LED_GPIO_Config() { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启GPIOB和GPIOF的外设时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*选择要控制的GPIOB引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIOA1*/ GPIO_Init(GPIOA, &GPIO_InitStructure); /*选择要控制的GPIOB引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /*调用库函数,初始化GPIOA2*/ GPIO_Init(GPIOA, &GPIO_InitStructure); /*选择要控制的GPIOB引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; /*调用库函数,初始化GPIOA3*/ GPIO_Init(GPIOA, &GPIO_InitStructure); /*关闭3个led*/ GPIO_SetBits(GPIOA, GPIO_Pin_1); GPIO_SetBits(GPIOA, GPIO_Pin_2); GPIO_SetBits(GPIOA, GPIO_Pin_3); } void Delay(__IO uint32_t nCount) //简单的延时函数 { for(; nCount != 0; nCount--); } int main(void) { LED_GPIO_Config(); while(1) { GPIO_ResetBits(GPIOA, GPIO_Pin_1); Delay(0x0FFFFF); GPIO_SetBits(GPIOA, GPIO_Pin_1); GPIO_ResetBits(GPIOA, GPIO_Pin_2); Delay(0x0FFFFF); GPIO_SetBits(GPIOA, GPIO_Pin_2); GPIO_ResetBits(GPIOA, GPIO_Pin_3); Delay(0x0FFFFF); GPIO_SetBits(GPIOA, GPIO_Pin_3); } }