stm32f107 新手入门笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对于STM32学习我的熟悉过程可以分以下阶段:
1、入门程序的熟悉
2、GPIOX的操作,各类寄存器原理的了解
3、逐个寄存器熟悉
4、中断,定时器的基础入门熟悉
5、USART的了解,
6、重复2345的步骤,加深对这些模块寄存器直接的协同了解突破,达到熟练。
在这里,我发下了STM32的USART基本字节发送非常简单,然后用这个来配合中断显示,在程序中插入各类输出显示,可以很清楚的知道程序中的运行状态,先后次序,对于程序调试有很大帮助。
STM32F107开发板入门篇一——第一个程序的理解:
准备开发环境MDK4.0以上,最简单的入门方式就是先调用MDK里面自带的例程程序,然后最好是先看
D:\Keil\ARM\Boards\Keil\MCBSTM32C\Blinky\Blinky.c
这里我就拿例这个例程序分析,虽然每句都分析了,但是刚入手STM32可能还是会有很多疑问,所以暂时不考虑寄存器问题,这里先给出一个程序的概念以及一些基本注意的东西,后面会有寄存器的说明:
阅读下面程序最好用MDK打开上面的程序配合看,效果更直观。
RCC->APB2ENR|=1<<6; //使能PE口时钟(STM32所有的寄存器操作都需要先使能时钟)
GPIOE->CRH=0x33333333; //配置PE口的高八位输出方式每位由4位二进制数控制,这里每位都是0011 代表50MHZ的高速输出参考GPIO->CRH
SystemInit();
/* Setup and initialize ADC converter */
RCC->APB2ENR |= 1 << 9; /* Enable ADC1 clock ADC1使能时钟*/
GPIOC->CRL &= 0xFFF0FFFF; /* Configure PC4 as ADC.14 input ADC1在此芯片用PC4来作为模拟输入设置为输入(IO口使用前都必须对其功能设置)*/ ADC1->SQR1 = 0x00000000; /* Regular channel 1 conversion 主要是第1,2位设置为0表示单通道采集其他位置0不是用其他功能*/
ADC1->SQR2 = 0x00000000; /* Clear register 清领SQR2寄存器不适用其他功能*/
ADC1->SQR3 = 14 << 0; /* SQ1 = channel 14 选用通道14,就是PC4 */
ADC1->SMPR1 = 5 << 12; /* Channel 14 sample time is 55.5 cyc 通道14的采样周期选择101 即55.5周期*/
ADC1->SMPR2 = 0x00000000; /* Clear register 清0采样寄存器二*/
ADC1->CR1 = 1 << 8; /* Scan mode on 开启扫描模式*/
ADC1->CR2 = (1 << 20) | /* Enable external trigger */
(7 << 17) | /* EXTSEL = SWSTART */
(1 << 1) | /* Continuous conversion */
(1 << 0) ; /* ADC enable 设置ADC控制寄存器配置,使能ADC */
ADC1->CR2 |= 1 << 3; /* Initialize calibration registers 初始化校准寄存器,由于此步骤需要一些周期,多以必须等待完成后才开始下一步操作*/
while (ADC1->CR2 & (1 << 3)); /* Wait for initialization to finish */
ADC1->CR2 |= 1 << 2; /* Start calibration 开始校准,然后等待校准完成*/
while (ADC1->CR2 & (1 << 2)); /* Wait for calibration to finish */
ADC1->CR2 |= 1 << 22; /* Start first conversion 启动转换*/
for (;;) { /* Loop forever */
if (ADC1->SR & (1 << 1)) { /* If conversion has finished 转换完成状态寄存器的1位置1 */
AD_val = ADC1->DR & 0x0FFF; /* Read AD converted value 转换结果保存在寄存器ADC1->DR 的低12位*/
ADC1->CR2 |= 1 << 22; /* Start new conversion 读取数据后再次启动转换*/
}
// GPIOE->BSRR=~(AD_val<<4);
/* Calculate 'num': 0, 1, ... , LED_NUM-1, LED_NUM-1, ... , 1, 0, 0, ... */
num += dir;
if (num >= LED_NUM) { dir = -1; num = LED_NUM-1; }
else if (num < 0) { dir = 1; num = 0; }
GPIOE->BSRR = led_mask[num]; /* Turn LED on */ for (i = 0; i < ((AD_val << 8) + 100000); i++); //这里的FOR 循环延时就是用来读取AD转换的高8位加上100000构成延时,通过改变AD控制延时时间,12位的低4 位不是很稳定,在这里可以忽略
GPIOE->BSRR = led_mask[num] << 16; /* Turn LED off */
看了这些分析后,一定有很多疑问,在入门篇二中将逐个解除这些疑问。当这些基本疑问解决后,就可以运用STM32的基本功能了。