搜档网
当前位置:搜档网 › STM32+指导教程

STM32+指导教程

STM32+指导教程
STM32+指导教程

豆 皮 教 程 目 录:

名 称 作 者 页 码

01. LED跑马灯littleworm 2

13

02.按键 + 蜂鸣器littleworm

03. SysTick 定时器littleworm

20

24

04.串口通讯 UART littleworm

05.豆皮会唱歌littleworm

31

06.I2C--24Cxx枫仔37

07. ADC with DMA枫仔43

08.内部温度传感器littleworm

49

55

09. SPI实战,Nokia5110 LCD littleworm

10. RTC初探枫仔61

64 11. Unique Device ID littleworm

66 12. STM32 ISP下载littleworm

72 13.SPI模式读写SD卡littleworm

80 14.基于STM32 的 FAT16文件系统littleworm

87

15.串口中间件的使用littleworm

16.EEPROM三备份带CRC校验枫仔89

17. IAP 之串口篇枫仔91

豆皮 - STM32开发板入门教程(一)LED 跑马灯

littleworm

版权所有 STMFANS 原创,转载请保留出处

一步一步创建第一个 IAR 工程 (IAR442 + ST-LINKII)

首先创建项目目录,拷贝公共文件:将 STM32 软件库中 FWlib 目录中的 library 目录拷贝到所建项目的目录中

这个是库 FWLIB 文件夹

把 FWlib 目录中的 library 目录拷贝到所建项目的目录中

将软件库的 Examples 目录里的任一例程的 stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h 和main.c 拷贝到项目的目录中(这里选择的是 GPIO 目录下的 \FWLib\examples\GPIO\IOToggle)TOP

拷贝软件库中 \project\EWARM\ 目录中的 stm32f10x_vector.c、cortexm3_macro.s、lnkarm_ram.xcl 和lnkarm_flash.xcl 到项目的目录中

好了,系统的库文件和一些stm32的特征文件已经 copy 过来了

下面开始忙活 IAR 了

打开 IAR442 点击菜单 File --> New -->Workspace 创建一个新的工程 TOP

点击菜单 Project --> Create New Project 创建一个项目 (empty 空白项目)

TOP

保存项目到设定的项目根目录中

在项目的位置点右键,然后点 add

用户可以向项目中添加 *.c 文件;也可以添加代码组,然后将c 文件添加到组里面

对于这个 LED 的例子,我添加了3个代码组

分别为 EWARM,FWLIB,USER

然后

1 . 把 stm32f10x_vector.c ,cortexm3_macro.s 这

2 个文件 add 到 EWARM 中

2. 把 stm32f10x_flash.c,stm32f10x_gpio.c,stm32f10x_lib.c,stm32f10x_nvic.c,stm32f10x_rcc.c 5 个文件 add 到 FWLIB 中

3. 把 main.c ,stm32f10x_conf.h, stm32f10x_it.c , stm32f10x_it.h 这 4 个文件 add 到 USER 中添加好的情况如下图所示

TOP

文件添加完毕 下面来配置一下这个工程

在项目名称上单击右键选择Option

或点击菜单 Project --> Option

点击 general options

设置 Taget

Processor Variant

core 选择 Cortex –M3

Device 选择 ST STM32F10x

Endian mode 选择 Little

Stack align 选择: 4 bytes

TOP

点击 C/C++ Compiler

Language

选择用户编程语言

Plain‘char’is:

Signed 表明使用 char 定义的 变量为有符号的;

Unsigned 表明使用 char 定义的变量为无符号的。

点击 Optimizations

根据使用需求选择代码 (Size)

或运行速度 (speed) 优化:

1. None ---用于调试

2. Low

3. Medium

4. High --- 用于最终代码

TOP

点击 Preprocessor

设置 *.h 文件所在目录

$PROJ_DIR$\

$PROJ_DIR$\library\inc\

然后在 defined symbols 里面写上 VECT_TAB_RAM

TOP

点击 Linker OutPut

选择上 Allow C-SPY specific extra output file

开启 C-SPY 调试器

点击 Extra Output 选择上 Generate extra output file 用于产生目标和调试文件

Output format 根据需要选择生成的目标文件 默认是 选择 simple – code

TOP

点击 Override default

选项:

1.如果在 Flash 中调试程序 设置 lnkarm_flash.xcl

2.如果在 RAM 中调试程序,设置 lnkarm_RAM.xcl

注意:在进行该项设置时,请确认电路板上的Boot0 和Boot1引脚的跳线连接是否正确

点击 Debugger

Setup 选择调试工具,由于我用的是 ST-LINNK2 所以选择的是 Third – Party Driver

勾选Run to main

TOP

点击 Download

1. 已选择下载程序到 Flash, 可选:Verify download ( Use flash loader(s) 必须开启!)

2. 已选择下载程序到 RAM 或使用模拟器:无需选择

3. 如果程序已下载到 Flash:开启 Suppress download

OK! 设置好了,我们来点一下 rebuild all

呵呵!出现了错误,那是因为所有代码我们都没修改,直接 copy 原来 example 的 稍作修改一下(去掉图示的 include ) 用于我们的 LED 控制

TOP

此工程创建完毕,我们就可以修改代码,进行编译和仿真了,hoho!

LED 跑马灯代码部分

RCC_Configuration(); // 配置系统时钟

NVIC_Configuration(); // 配置 NVIC 和 Vector Table

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

// 改变指定管脚的映射 GPIO_Remap_SWJ_Disable SWJ 完全禁用(JTAG+SW-DP)

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);

// 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能

GPIO_Configuration(); // 配置使用的 GPIO 口

while (1)

{

亮 - 延迟 - 灭

………..

}

这里说明一下,因为我们豆皮上面的 8 个 LED 灯中,有一个 LED 接在了 JTAG 的引脚上(PA15)。在复位后,用于 SWJ-DP 的 5 根引脚被分配为调试器主机立即可用的专用引脚。但是呢,STM32F10xMCU 提供了REMAP_DBGAFR 寄存器用来禁用 SWJ-DP 端口的部分或者全部,这样相关的引脚将被用于通用的 IO。对该寄存器的编程是用户软件来完成的,而不是由调试主机来完成的。那么,在库函数中提供了GPIO_PinRemapConfig() 这么一个函数来改变指定管脚的映射。程序中就使用了这个函数来修改 JTAG 引脚用于 GPIO 口。

PS: 本教程附件中的代码 下载后是不能仿真的 因为程序跑起来后就把JTAG引脚给disable 了 如果需要仿真 那么请把这GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

和 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); 注释掉 呵呵

TOP

豆皮 - STM32开发板入门教程(二) - 按键 + 蜂鸣器(原创)

littleworm

呵呵 在教程一的基础上 继续做偶们的按键和蜂鸣器

呵呵 豆皮板子上一共有5个按键(4个功能按键 + 一个RESET按键)

那么 选择 LED5 LED6 LED7 LED8 与按键 KEY1 KEY2 KEY3 KEY4 一一对应

按键按下的时候 对应的LED灯就亮起来 然后只要有按键安下 蜂鸣器就响 呵呵

初始化

//配置KEY使用的GPIO口

KEY_GPIO_Configuration();

//配置buzzer蜂鸣器使用的端口

BUZZER_GPIO_Configuration();

分别对应的函数体

按键的初始化函数体

/*******************************************************************************

* Function Name : KEY_GPIO_Configuration

* Description : Configures the KEY GPIO ports.

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void KEY_GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

//按键使用的GPIOC 的 Pin6 Pin7 Pin8 端口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 ;

// GPIO口的速度 作为按键 10MHz 对于一般的用途 足以 呵呵

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//按键端口设置为 浮空输入 TOP

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOC, &GPIO_InitStructure);

//按键使用的GPIOB 的 Pin15 端口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;

// GPIO口的速度 作为按键 10MHz 对于一般的用途 足以 呵呵

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//按键端口设置为 浮空输入

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOB, &GPIO_InitStructure);

}

蜂鸣器的初始化函数体

/*******************************************************************************

* Function Name : BUZZER_GPIO_Configuration

* Description : Configures the BUZZER GPIO ports.

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void BUZZER_GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

//蜂鸣器使用的GPIOB 的 Pin9 端口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;

//蜂鸣器的IO口速度暂时也设置为10MHz 如果以后想用PWM控制蜂鸣器发出各种不同声音就需要把速度设置高一点

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//蜂鸣器端口设置为 推挽输出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);

}

蜂鸣器的接法 也是标准接法 呵呵 如下图所示

TOP

程序的流程是:

1. 依次扫描4个按键 使用一个u8变量的低4位存储扫描结果 如果对应位上的按键被按下 则该位置1 否则 置0 可以支持多个按键同时按下

2. 处理扫描结果 依次判断u8变量的低4位 如果某个按键被按下 则点亮对应的LED灯

3. 判断当前是否有按键按下 如果有 则蜂鸣器响 否则 蜂鸣器不响

按键扫描函数

/*******************************************************************************

* Function Name : KEY_GPIO_Scanning

* Description : 依次扫描4个按键 使用一个u8变量的低4位存储扫描结果

* Input : None

* Output : None

* Return : 扫描的结果 有效数据是低4位

*******************************************************************************/

u8 KEY_GPIO_Scanning(void)

{ TOP

u8 scan_bit; //单个按键扫描变量

u8 scan_sum; //四个按键总的情况变量 scan_sum低四位的每一位对应一个按键

scan_bit = 0;

scan_sum = 0;

//扫描按键

scan_bit = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);

//如果按键按下 则延迟 再扫描 然后根据判断处理

if( 0x01 == scan_bit )

{

delay();

scan_bit = 0;

scan_bit = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);

if( 0x01 == scan_bit )

scan_sum |= GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);

scan_bit = 0;

}

scan_bit = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7);

if( 0x01 == scan_bit )

{

delay();

scan_bit = 0;

scan_bit = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7);

if( 0x01 == scan_bit )

scan_sum |= GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)<<1;

scan_bit = 0;

}

scan_bit = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6);

if( 0x01 == scan_bit )

{

delay();

scan_bit = 0;

scan_bit = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6); TOP

if( 0x01 == scan_bit )

scan_sum |= GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)<<2;

scan_bit = 0;

}

scan_bit = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15);

if( 0x01 == scan_bit )

{

delay();

scan_bit = 0;

scan_bit = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15);

if( 0x01 == scan_bit )

scan_sum |= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15)<<3;

scan_bit = 0;

}

return scan_sum;

}

按键处理函数

/*******************************************************************************

* Function Name : LED_For_Key_Shine

* Description : 按键处理函数

* Input : u8 变量 按键扫描结果

* Output : None

* Return : None

*******************************************************************************/

void LED_For_Key_Shine(u8 scan_sum)

{

//使用一个8位变量 表示当前是否有按键按下

// 初始值为4 如果没有按键按下 扫描完scan_sum之后 该值为0 如果该值不为0 则证明有按键按下

u8 key_count = 4 ;

TOP

if( scan_sum & 0x01 )

{

GPIO_SetBits(GPIOD, GPIO_Pin_2);

key_count--;

}

else

{

GPIO_ResetBits(GPIOD, GPIO_Pin_2);

key_count++;

}

if( scan_sum & 0x02 )

{

GPIO_SetBits(GPIOD, GPIO_Pin_3);

key_count--;

}

else

{

GPIO_ResetBits(GPIOD, GPIO_Pin_3);

key_count++;

}

if( scan_sum & 0x04 )

{

GPIO_SetBits(GPIOD, GPIO_Pin_4);

key_count--;

}

else

{

GPIO_ResetBits(GPIOD, GPIO_Pin_4);

key_count++;

}

if( scan_sum & 0x08 )

{ TOP

GPIO_SetBits(GPIOD, GPIO_Pin_5);

key_count--;

}

else

{

GPIO_ResetBits(GPIOD, GPIO_Pin_5);

key_count++;

}

//如果 key_count为0 则表示当前没有按键被按下 蜂鸣器不响 否则 蜂鸣器响

if( key_count == 0 )

GPIO_ResetBits(GPIOB, GPIO_Pin_9);

else

GPIO_SetBits(GPIOB, GPIO_Pin_9);

}

TOP

豆皮 - STM32开发板入门教程(三) - SysTick 定时器(原创)

littleworm

OK 下面继续做偶们的SysTick定时器咯 呵呵

本教程的主角是:SysTick

通常实现Delay(N)函数的方法为:

for(i = 0; i <= x; i ++);

x --- 对应于 对应于N 毫秒的循环值

对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫 秒的精确值。针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。

Cortex-M3的内核中包含一个SysTick时钟。SysTick 为一个24位递减计数器,SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能)。

在STM32的应用中,使用Cortex-M3 内核的SysTick作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数

里对N减一,在Delay(N)函数中循环检测N是否为0,不为0则进行循环等待;若为0则关闭SysTick 时钟,退出函数。

注: 全局变量TimingDelay 必须定义为volatile

延迟时间将不随系统时钟频率改变。

外部晶振为8MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为9MHz(最大为HCLK/8),在这个条件下,把SysTick 效验值设置成9000,将SysTick 时钟设置为9MHz, 就能够产生1ms的时间基值,即SysTick产生1ms的中断。

TOP

MINI-STM32 开发板入门教程.

MINI-STM32 开发板入门教程(一) 开发环境建立及其应用 我们常用的 STM32 开发编译环境为 Keil 公司的 MDK (Microcontroller Development Kit) 和 IAR 公司的 EWARM. 在这里我们提供了比较稳定的新版本编译软件下载: MDK3.50 点击此处下载 EWARM 5.40 点击此处下载 限于篇幅, 在我们的教程里面将先以 MDK 下的一个例子来介绍如何使用 MDK 进行嵌入式 应用开发. MDK 安装与配置: 基于 MDK 下的开发中基本的过程: (1) 创建工程; (2) 配置工程; (3) 用 C/C++ 或者汇编语言编写源文件; (4) 编译目标应用程序 (5) 修改源程序中的错误 (6) 测试链接应用程序 ---------------------------------------------------------------- (1) 创建一个工程: 在 uVision 3 主界面中选择 "Project" -> "New uVision Project" 菜单项, 打开一个标准对话框选择好你电脑中的保存目录后, 输入一个你的工程名字后点确认.我们的工程中建了一个名字叫 "NewProject" 的工程. 从设备库中选择目标芯片, 我们的 MINI-STM32 开发板使用的是 STM32F103V8T6, 因此选 中 STMicrocontroller 下对应的芯片: ARM 32-bit Cortex-M3 Microcontroller, 72MHz, 64kB Flash, 20kB SRAM, PLL, Embedded Internal RC 8MHz and 32kHz, Real-Time Clock, Nested Interrupt Controller, Power Saving Modes, JTAG and SWD,

STM32入门教程

前言 一天入门STM32,仅一天的时间,是否有真的这么快。不同的人对入门的理解不一样,这篇一天入门STM32的教程,我们先对入门达成一个共识,如果你有异议,一天入门不了,请不要较真,不要骂街,保持一个工程师该有的修养,默默潜心学习,因为你还有很大的上升空间。 我眼中的入门:(前提是你学过51单片机和C语言) 1、知道参考官方的什么资料来学习,而不是陷入一大堆资料中无从下手。 2、知道如何参考官方的手册和官方的代码来独立写自己的程序,而不是一味的看到人家写的代码就觉得人家很牛逼。 3、消除对STM32的恐惧,消除对库开发的恐惧,学习是一个快乐而富有成就感的过程。

第1章一天入门STM32 本章参考资料:《STM32中文参考手册》《CM3权威指南CnR2》 学习本章时,配合《STM32中文参考手册》GPIO章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。 1.151与STM32简介 51是嵌入式学习中一款入门级的精典MCU,因其结构简单,易于教学,且可以通过串口编程而不需要额外的仿真器,所以在教学时被大量采用,至今很多大学在嵌入式教学中用的还是51。51诞生于70年代,属于传统的8位单片机,如今,久经岁月的洗礼,既有其辉煌又有其不足。现在的市场产品竞争激烈,对成本极其敏感,相应地对MCU的要求也更苛刻:功能更多,功耗更低,易用界面和多任务。面对这些要求,51现有的资源就显得得抓襟见肘了。所以无论是高校教学还是市场需求,都急需一款新的MCU来为这个领域注入新的活力。 基于这市场的需求,ARM公司推出了其全新的基于ARMv7架构的32位Cortex-M3微控制器内核。紧随其后,ST(意法半导体)公司就推出了基于Cortex-M3内核的MCU—STM32。STM32凭借其产品线的多样化、极高的性价比、简单易用的库开发方式,迅速在众多Cortex-M3MCU中脱颖而出,成为最闪亮的一颗新星。STM32一上市就迅速占领了中低端MCU市场,受到了市场和工程师的无比青睐,颇有星火燎原之势。 作为一名合格的嵌入式工程师,面对新出现的技术,我们不是充耳不闻,而是要尽快吻合市场的需要,跟上技术的潮流。如今STM32的出现就是一种趋势,一种潮流,我们要做的就是搭上这趟快车,让自己的技术更有竞争力。 1.1.151与STM32架构的区别 我们先普及一个概念,单片机(即MCU)里面有什么。一个人最重要的是大脑,身体的各个部分都在大脑的指挥下工作。MCU跟人体很像,简单来说是由一个最重要的内核加其他外设组成,内核就相当于人的大脑,外设就如人体的各个功能器官。 下面我们来简单介绍下51和STM32的结构。 1.51系统结构 51系统结构框图

用STM32一步一步点亮led灯

STM32之一步一步点亮led (2011-05-09 19:40) 标签: stm32led v3.4MDK 4.12入门分类:stm32 入手stm32以来,一直想快速上手,所以在各大论坛闲逛,各个达人的blog 上学习,正所谓欲速则不达,心急是吃不了热豆腐的!有木有? 最终决定使用st官网的库开发,据大侠们写道使用库可以快速上手,貌似的确如此,一个个教程写的那么好,直接拿过来用就是了。可是那么多个库,聪明的你请告诉到底选择哪一个啊?My God!实话实说,我被这些库折腾了个够!好吧,我最后还是承认最后用的是v3.4的库,是很方便! 切入正题,点亮LED。 硬件:红牛开发板,STM32F103ZET6(144封装). 软件:RealView MDK 4.12 stm32固件库:v3.4 附上自己整理后的库: V3.4_clean.rar 根据官网库自己整理了下,新建了工程模板如下图:(主要参考文章《在 Keil MDK+环境下使用STM32 V3.4库.pdf》)在KeilMDK+环境下使用STM32V3.4库.pdf 入图所示:新建一个目录01_ProLed,建议放在英文路径下,避免不必要的麻烦。将上面的库v3.4解压到此目录,再新建一个project目录,存放工程。 说明: CMSIS:最底层接口。StartUp:系统启动文件。StdPeriph_Lib:stm32外围设

备驱动文件。Project:工程文件。User:用户文件。新建工程步骤:此处略去300字。 简单说明: 1.core_cm3.c/core_cm3.h 该文件是内核访问层的源文件和头文件,查看其中的代码多半是使用汇编语言编写的。在线不甚了解。--摘自《在Keil MDK+环境下使用STM32 V3.4库》 2.stm32f10x.h 该文件是外设访问层的头文件,该文件是最重要的头文件之一。就像51里面的reg51.h一样。例如定义了 CPU是哪种容量的 CPU,中断向量等等。除了这些该头文件还定义了和外设寄存器相关的结构体,例如: 1.typedef struct

STM32入门基本知识

STM32学前班教程之一:选择他的理由 经过几天的学习,基本掌握了STM32的调试环境和一些基本知识。想拿出来与大家共享,笨教程本着最大限度简化删减STM32入门的过程的思想,会把我的整个入门前的工作推荐给大家。就算是给网上的众多教程、笔记的一种补充吧,所以叫学前班教程。其中涉及产品一律隐去来源和品牌,以防广告之嫌。全部汉字内容为个人笔记。所有相关参考资料也全部列出。:lol 教程会分几篇,因为太长啦。今天先来说说为什么是它——我选择STM32的原因。 我对未来的规划是以功能性为主的,在功能和面积之间做以平衡是我的首要选择,而把运算放在第二位,这根我的专业有关系。里面的运算其实并不复杂,在入门阶段想尽量减少所接触的东西。 不过说实话,对DSP的外设并和开发环境不满意,这是为什么STM32一出就转向的原因。下面是我自己做过的两块DSP28的全功能最小系统板,在做这两块板子的过程中发现要想尽力缩小DSP的面积实在不容易(目前只能达到50mm×45mm,这还是没有其他器件的情况下),尤其是双电源的供电方式和的电源让人很头疼。 后来因为一个项目,接触了LPC2148并做了一块板子,发现小型的ARM7在外设够用的情况下其实很不错,于是开始搜集相关芯片资料,也同时对小面积的AVR和51都进行了大致的比较,这个时候发现了CortexM3的STM32,比2148拥有更丰富和灵活的外设,性能几乎是2148两倍(按照MIPS值计算)。正好2148我还没上手,就直接转了这款STM32F103。 与2811相比较(核心供电情况下),135MHz×1MIPS。现在用STM32F103,72MHz×,性能是DSP的66%,STM32F103R型(64管脚)芯片面积只有2811的51%,STM32F103C型(48管脚)面积是2811的25%,最大功耗是DSP的20%,单片价格是DSP的30%。且有更多的串口,CAP和PWM,这是有用的。高端型号有SDIO,理论上比SPI速度快。 由以上比较,准备将未来的拥有操作系统的高端应用交给DSP的新型浮点型单片机28335,而将所有紧凑型小型、微型应用交给STM32。 STM32学前班教程:怎么开发 sw笨笨的STM32学前班教程之二:怎么开发目前手头的入门阶段使用的开发器概述 该产品为简易STM32调试器和DEMO板一体化的调试学习设备,价格在一百多块。 2、硬件配置

STM32F103中文教程及参考手册

参考手册 STM32F101xx和STM32F103xx ARM内核32位高性能微控制器 导言 本参考手册针对应用开发,提供关于如何使用 STM32F101xx和STM32F103xx微控制器的存储器 和外设的详细信息。在本参考手册中STM32F101xx 和STM32F103xx被统称为STM32F10xxx。 STM32F10xxx系列拥有不同的存储器容量,封装和 外设配置。 关于订货编号,电器和物理性能参数,请参考 STM32F101xx和STM32F103xx数据手册。 关于芯片内部闪存的编程,擦除和保护操作,请参考 STM32F10xxx闪存编程手册。 关于ARM Cortex?-M3内核的具体信息,请参考 Cortex?-M3术参考手册。 * 感谢南京万利提供原始翻译文档

目录 1文中的缩写14 1.1寄存器描述表中使用的缩写列表------------------------------------------------------14 2存储器和总线构架15 2.1系统构架-------------------------------------------------------------------------------------15 2.2存储器组织---------------------------------------------------------------------------------16 2.3存储器映像---------------------------------------------------------------------------------17 2.3.1 外设存储器映像----------------------------------------------------------------------18 2.3.2 嵌入式SRAM--------------------------------------------------------------------------20 2.3.3 位段--------------------------------------------------------------------------------------20 2.3.4 嵌入式闪存----------------------------------------------------------------------------20 2.4启动配置-------------------------------------------------------------------------------------22 3电源控制(PWR) 23 3.1电源-------------------------------------------------------------------------------------------23 3.1.1 独立的A/D转换器供电和参考电压-----------------------------------------------23 3.1.2 电池备份区域-------------------------------------------------------------------------24 3.1.3 电压调节器----------------------------------------------------------------------------24 3.2电源管理器---------------------------------------------------------------------------------25 3.2.1 上电复位(POR)和掉电复位(PDR)-------------------------------------------------25 3.2.2 可编程电压监测器(PVD)-----------------------------------------------------------25 3.3低功耗模式---------------------------------------------------------------------------------26 3.3.1 降低系统时钟-------------------------------------------------------------------------27 3.3.2 外部时钟的控制----------------------------------------------------------------------27 3.3.3 睡眠模式-------------------------------------------------------------------------------27 3.3.4 停止模式-------------------------------------------------------------------------------28 3.3.5 待机模式-------------------------------------------------------------------------------29 3.3.6 低功耗模式下的自动唤醒(AWU)-------------------------------------------------31 3.4电源控制寄存器---------------------------------------------------------------------------32 3.4.1 电源控制寄存器(PWR_CR)--------------------------------------------------------32 3.4.2 电源控制/状态寄存器----------------------------------------------------------------33 3.5PWR寄存器地址映像--------------------------------------------------------------------34 4复位和时钟控制35 4.1复位-------------------------------------------------------------------------------------------35 4.1.1 系统复位-------------------------------------------------------------------------------35 4.1.2 电源复位-------------------------------------------------------------------------------36 4.1.3 备份域复位----------------------------------------------------------------------------36 4.2时钟-------------------------------------------------------------------------------------------36 4.2.1 HSE时钟--------------------------------------------------------------------------------38 4.2.2 HSI时钟---------------------------------------------------------------------------------39

STM32F103RCT6使用说明

STM32开发板使用手册 风帆 STM32开发板是风帆电子为初学者学习STM32 Cortex M3 系列ARM 而设计的学习板。以STM32F103RCT6芯片为核心,配套2.4/2.8寸彩色TFT屏模块,板载UART、USB、ADC电压调节、按键、JTAG接口、彩屏接口、流水灯、SD卡接口、IO引出口等多种硬件资源。

JTAG 口 2个LED 灯 GPIOA 引出1O USB 串口1 DS10B20预留 HS0038红外接收头 红外温度传感器连接头 GPIOB@C 引出IO OLED@LCD 共用接口 STM32F103RCT6 2.4/2.8寸LCD 接口 485芯片 RS485接口 1:A; 3:B NRF24L01 模块接口 W25Q1 6 FLASH 芯片 SD 卡接口(在背面) JF24C 模块预留接口 GPIO C@D 引出IO 蜂鸣器跳线 PS/2鼠标键盘接口 三个按 键: WAKEUP KEY0 KEY1 RESET 按键 Rs232接口 电源开关 USB 接口 电源指示灯 自恢复保险丝 MAX232 电源芯片 24c02 3.3V 、5V 电 源输出; 线序为: GND/3.3V GND/5V BOOT 设置 线序为: GND /GND BOOT1/BOOT0 3.3V/3.3V

此板子不管硬件还是软件完全无缝接兼容正点原子的MINSTM32,并对MINSTM32进行了完美的升级,让我们用最少的钱做更多的事,具体升级的部分包括: 1、C PU的升级 利用ST意法半导体的CPU兼容性强的优点,此板采用比 STM32F103RBT6性能更强、且完全兼容的的STM32F103RCT6升级 CPU,把完美的MINNI STM板子的功能发挥到极致,具体2个CPU 的主要资源对比如下: 可以看出,FLASH增加了一倍,达到256K,RAM也增加了1倍,让 我们不用再为FLASH\RAM小而烦恼,使我们的存储空间更为强大; 增加了一个16位普通IC/OC/PWM),2个16位基本(IC/OC/PWM),1个STI,2个USART,这里比STM32F103RB还多了一个DAC通 道,这个STM32F103RB是没有的

STM32小白学习心得

1.首先我们先看看与STM32相关的文档 我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解,请立即阅读STM32的文档,以获取最基本的知识点。 如果你手上拥有ST官方主推的STM32神舟系列的板子,那么光盘都会配好这些文档,STM32的学习与ARM9的学习有一个很大的区别。ARM9的学习 一般是需要购买书籍的。比如三星的S3C2440,官方的文档都是英文的,大部分工程师只能去看国内出版的书籍。英文好的同学,请不要以为 你很牛,可以只看英文文档。毕竟你是中国人,你最熟悉的,理解最好的还是中文。看英文的速度还是比看中文慢一些,我们要的是最短的时 间,而不是追求短时间内记住所有细节。当然,如果是一篇论文,建议看英文原版还是有好处的。 STM32处理器进入国内市场时候,ST官方(或者第三方)的推广工作做的非常好。翻译了大量的英文文档,迎合了国内的 很多工程师的思维。神舟系列的开发板就是迎合这种中国化,本土化,方便学习和使用;所以现在大部分STM32F103xxx的用户datasheet都有 中文版,例子也很齐全,因此可以不用去购买书籍,看电子档即可。 学习的时候,关注两个比较重要的文档:《STM32F103xxx参考手册》,《STM32固件库使用手册》。 该网址,是针对有充足的时间、精力的同学,建议去下载需要查阅的文档,以获取更多信息。 阅读《STM32F103xxx参考手册》,一定要注意,不需要全部阅读——没有时间的。建议选读,但是前几章必读。存储器 和总线架构、电源控制、备份寄存器、复位和时钟控制,通用和复用功能I/O,中断和时间等等前几章一定要花时间阅读。 后面章节,讲述的是具体的功能模块设计。如果我们用到哪个模块,就可以去阅读哪个模块。比如在使用AD的时候,就 需要去阅读第10章ADC。其他不举例。相信每个初学者都有自己的研究方向和判断。 阅读《STM32固件库使用手册》,主要是为了简化编程。STM32给我们提供了一个非常好的固件函数库,我们只要去调用 即可。当然,我们也可以不去碰这些固件库——传说使用它会使得代码效率变低,是有道理的。网络上也出现了很多网友自己写的代码,没有 使用带固件库函数。如何取舍,在于您的选择。 这里我主要强调的是,阅读《STM32固件库使用手册》的时候,前面几章

STM32教程(1)

第一部分开发板介绍 1.1 STM32开发板简介 开发板配置: ●CPU主芯片是STM32F103VCT6,主频72MHz,256KB FLASH ,48KB RAM; ●3个按键,可实现中断或查询方式判断是否有键按下; ●4个发光二极管LED,可进行流水灯或花样显示; ●1个无源蜂鸣器,可用PWM驱动; ●1个电位器,可配合内部AD进行AD转换; ●1个RS232串行通信接口,可使开发板与PC机进行通信; ●1个基于SPI串行总线的触摸屏转换接口芯片,可进行触屏操作; ●1个基于IIC串行总线的EEPROM,可进行数据存储; ●1个基于CPU片内SDIO的TF卡接口,可进行数据读写; ●1个FSMC控制的2.83英寸TFT液晶屏,可进行图片文字显示; ●1个蓝牙模块,可使开发板与PC机进行通信; ●1个USBmin2.0接口为开发板供电; ●所有I/O口引出,可通过跳线自行配置和自制外围模块连接;

下面介绍一下STN32开发板的各个部分。 1、LED灯 STM32开发板有4个LED灯,它们在开发板上的标号分别为LED1、LED2、LED3、LED4。在调试代码的时候,使用LED来指示程序状态,是非常不错的辅助调试方法。 2、按键 STM32开发板有三个普通按键,它们在开发板上的标号分别为KEY1、KEY2、KEY3。可以用于人机交互的输入,三个按键通过跳线帽连接到STM32的开发板的IO口上。 3、电源指示灯 开发板上有一个蓝色电源指示灯,它在开发板上的标号为LED5(POWER)。用于指示电源状态。该开发板通过USB供电,在该电源开启的情况下,指示灯亮,否则不亮。通过这个LED灯判断开发板的上电情况。 4、蓝牙 开发板上有一个蓝牙模块,它在开发板上的标号为Bluetooth。用于开发板与电脑进行无线通讯。 5、SD卡接口 SD卡接口在开发板上的标号为TF_Card。SD卡是最常见的存储设备,是很多数码设备的存储媒介,比如数码相框、数码相机、MP5等。STM32开发板自带了SD卡接口,可用于SD卡试验,方便大家学习SD卡。 6、AT24C01 EEPROM EEPROM型号为A T24C01,用于掉电数据保存。因为STM32内部没有EEPROM,所以开发板外扩了24C01,用于存储重要的数据,也可以用来做IIC实验,及其他应用。 7、RS232接口 RS232在开发板上的标号为J2。用于与电脑进行通信,也可以用来做USART实验。 8、滑动变阻器 滑动变阻器在开发板上的标号为ADJ_RES。通过调节滑动变阻器来改变电压值,可以用来做AD转换的实验。 9、蜂鸣器 蜂鸣器在开发板上的标号为Buzzer。通过调节定时器产生的PWM波的占空比来改变蜂鸣器的声音,可以用来做PWM实验,及其他应用。 10、液晶屏 触摸屏在开发板上的标号为TFT。用来显示一些图片和汉字。可以用来学习触摸屏的一些实验。触摸屏都需要一个AD转换器,STM32开发板触摸屏控制芯片为TSC2046。 11、引出IO口 开发板有很多引出IO口,可以通过跳线帽选择是连接各部分的功能模块还是用作引出IO 口,引出的IO口方便大家使用,可以连接外部器件。 1.2 STM32开发板硬件详解 本节介绍STM32开发板的各部分硬件,让大家对开发板的各部分硬件原理有个了解。

(完整版)STM32F103通用教程

STM32F103_使用心得 IO端口输入输出模式设置:...........; Delay延时函数:..............; IO端口使用总结:...............; IO口时钟配置:................; 初始化IO口参数:...............; 注意:时钟使能之后操作IO口才有效!......; IO端口输出高低电平函数:...........; IO的输入 IO端口输入输出模式设置: (1) Delay延时函数: (2) IO端口使用总结: (2) IO口时钟配置: (2) 初始化IO口参数: (2) 注意:时钟使能之后操作IO口才有效! (2) IO端口输出高低电平函数: (2) IO的输入和输出宏定义方式: (3) 读取某个IO的电平函数: (3) IO口方向切换成双向 (3) IO 口外部中断的一般步骤: (3) 内部ADC使用总结: (4) LCDTFT函数使用大全 (5) TFTLCD使用注意点: (5)

IO端口宏定义和使用方法: (6) Keil使用心得: (6) ucGUI移植 (6) DDS AD9850测试程序: (6) ADC 使用小结: (7) ADC测试程序: (9) DAC—tlv5638测试程序 (9) 红外测试程序: (9) DMA使用心得: (9) 通用定时器使用: (9) BUG发现: (10) 编程总结: (10) 时钟总结: (10) 汉字显示(外部SD卡字库): (11) 字符、汉字显示(内部FLASH) (12) 图片显示: (16) 触摸屏: (17) 引脚连接: (19) IO端口输入输出模式设置: Delay延时函数: delay_ms(u16 nms); delay_us(u32 nus); IO端口使用总结: 1)使能IO 口时钟。调用函数为RCC_APB2PeriphClockCmd()。 2)初始化IO 参数。调用函数GPIO_Init();

芯达STM32入门系列教程之三《如何使用J-Flash调试》

STM32入门系列教程如何使用J-Flash调试 Revision0.01 (2010-04-12)

对初学者来说,要进行STM32的程序下载调试,一般有三种方法: (1)使用SEGGER J-Flash(J-Link)下载程序到闪存中运行; (2)使用串口ISP来下载HEX文件到CPU中运行; (3)J-Link+MDK组合,来在线调试程序(可下载、调试)。 本文档讲述如何在芯达STM32开发板上使用SEGGER J-Flash下载HEX文件。而其他两种方法,我们将在文档《如何使用MDK+J-Link调试》、以及《如何使用STM32-ISP下载调试》中详细说明。 先来解释SEGGER。实际上,大家更为熟悉的ARM仿真器J-Link,就是由SEGGER公司开发的。J-Link是SEGGER为支持仿真ARM内核芯片推出的JTAG 仿真器。 不管什么CPU的仿真器,都需要安装其相应的驱动后才能使用。J-Link也不例外,它的驱动软件可以去官方网站:https://www.sodocs.net/doc/ce4620766.html,下载最新版本。这里使用的驱动软件版本是V4.08l,该驱动的安装非常简单,请参考文档《如何安装J-Link驱动软件》。 安装完毕,会出现如下两个图标: 现在开始我们的工作吧! 步骤一先进行设备连接操作。芯达STM开发板的JTAG口(开发板面朝上,最顶端有一个JTAG20pin的插口),与J-Link V8仿真器的输出排线连接,J-Link另一头的USB插口则插在电脑的USB口上。这时,J-Link的指示灯开始闪烁,并保持“点亮”的状态。 注意:大家购买J-Link仿真器的时候,JTAG接口要求是标准的20pin的2.54间距的针座。否则需要转接卡进行JTAG接口的转换。 步骤二进入PC的桌面,点击上图左边的图标:J-Flash ARM V4.081,出现如下界面:

STM32-开发入门教程.doc

STM32 开发入门教程 (一 ) 开发环境建立及其应用 入门准备: 我们常用的STM32开发编译环境为 和 IAR公司的EWARM. Keil 公司的MDK(Microcontroller Development Kit) 在这里我们提供了比较稳定的新版本编译软件下载: MDK4.10 限于篇幅 , 在我们的教程里面将先以MDK下的一个例子来介绍如何使用 式应用开发 . MDK 进行嵌入MDK 安装与配置 : 基于MDK下的开发中基本的过程: (1)创建工程 ; (2)配置工程 ; (3)用 C/C++ 或者汇编语言编写源文件 ; (4)编译目标应用程序 (5)修改源程序中的错误 (6)测试链接应用程序 ---------------------------------------------------------------- (1)创建一个工程 : 在 uVision 3 主界面中选择 "Project" -> "New uVision Project" 菜单项 , 打开一个标准对话 框选择好你电脑中的保存目录后名字叫 "NewProject" 的工程 , 输入一个你的工程名字后点确认 . .我们的工程中建了一个 从设备库中选择目标芯片选中STMicrocontroller , 我们的MINI-STM32 下对应的芯片: 开发板使用的是STM32F103V8T6, 因此 ARM 32-bit Cortex-M3 Microcontroller, 72MHz, 64kB Flash, 20kB SRAM, PLL, Embedded Internal RC 8MHz and 32kHz, Real-Time Clock, Nested Interrupt Controller, Power Saving Modes, JTAG and SWD, 3 Synch. 16-bit Timers with Input Capture, Output Compare and PWM, 16-bit 6-ch Advanced Timer, 2 16-bit Watchdog Timers, SysTick Timer, 2 SPI, 2 I2C, 3 USART, USB 2.0 Full Speed Interface, CAN 2.0B Active, 2 12-bit 16-ch A/D Converter, Fast I/O Ports

STM32快速入门教程

STM32快速入门教程 开发编译的软件:IAR EWARM 4.42A JTAG工具:ST-LINK2(开发板自带) 开发板:万利STM32EK(199元) 建议看的资料: 《STM32F10X-128K-EVAL MCU》ST公司STM32开发板的电路图 《STM32技术参考手册—RM0008.pdf 或STM32F103-CN.pdf 》 《Cortex-M3权威指南Cn.pdf》 《如何在IAR下使用STM库.pdf》 《STM32F10xxx_Library_Manual_ChineseV2.pdf》 《汉化STM32F的固件.rar》----网友: SUNKE9 《netjob的BLOG上的初学者笔记》 STM32 :把引脚BOOT1,BOOT0接地,3。3伏特供电,STM32就可以运行,无需外部接晶振。 芯片内部有复位电路。STM32上电后默认使用内部【精度8MHZ左右】晶振,如果外部接了8MHZ, 可以切换使用外部8MHZ,并最终PLL倍频到72MHZ. 软件开发上,我们可以从万利公司或ST公司给IAR公司写的STM32例子,首先一点,目前STM32软件开发都是使用ST公司STM32库,而我的BLOG 上例子不是使用STM32库。 我自己建立了STM32的头文件:stm32f103.h 原因是ST公司的STM32函数库太庞大复杂,效率低。而且会让开发人员不懂的如何操作STM32 的寄存器,不懂的CPU 是如何工作的。 一个STM32程序,有几个必要文件: 【 stm32f103.h 我自己定义的STM32头文件用来代替STM32函数库 cortexm3_macro.s 宏定义函数 stm32f10x_vector.c 中断初始化 stm32f10x_it.c 中断函数 main.c 主函数 】 //=================================================== // 完整例子:万利开发板上跑马灯程序 // 轮流点亮LED灯。 //===================================================

STM32F103编程入门

STM32F103单片机编程入门 一款单片机入门,至少四样:时钟、端口、定时、串口、中断。 系统时钟 RCC 系统内部有8M_RC晶振和32678Hz_RC晶振有大约2%的温飘。当外部有8M 晶振时,自动选择外部晶振,失效时自动切换成内部。程序自动倍频成72M。 如果用于通信最好加个外部晶振。判断是否使用外部晶振的方法:短接外部晶 振引脚观察工作情况。 分为两个桥,对应不同的外设,每个外设又可以单独设定时钟。 初步学习,先不用单独设定,均选用系统时钟72M。可根据情况做一步分频。 用到某外设时,配置RCC(打开外设时钟),一般只有一句指令。一般临时查找。呵呵,我也没找到好办法。 GPIO:RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE); USART:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); Timer2:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); 端口GPIO 端口配置思路: 1,先定义一个结构体配置成员参数值, 类型是GPIO_InitTypeDef,下划线是结构体名;结构体名是GPIO_InitStructure:名称可以自定义。在后面利用参数初始化函数时要一致。 2,打开相对应的端口时钟RCC。 3,声明要配置的管脚,可以用“|”复选 4,配置模式,4种输入,4种输出 5,配置管脚频率,一般都是50Mhz 6,最后调用函数GPIO_Init(GPIOA, &GPIO_InitStructure);第2个参数是,结构体地址指针。 Eg: GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); 一、串口 USART 串口配置思路: 1,定义结构体,类型是USART_InitTypeDef; 2,打开串口时钟,可以选择和端口GPIO一起 3,设置波特率,—————省去了复杂的烦人的计算 4,设置字长。8位?9位? 5,设置停止位。1位?2位? 6,设置校验位,奇偶?无? 7,设置硬件流(调制解调器用)————用不到设None就行 8,串口工作模式:收?发?都有? 9,调用函数USART_Init(USART1, &USART_InitStructure); 配置串口 10,开启串口中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);或USART_IT_TXE, ENABLE);收发中断的使能。 11,中断响应函数void USART1_IRQHandler(void) 12,取出缓存数据data=USART_ReceiveData(USART1);读操作自动清零串口接 受标志位。 13,发送数据USART_SendData(USART2,FromScreen[Ua1])和 while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);等待发送 完成(寄存器非空)。 Eg: USART_InitTypeDef USART_InitStructure;

DL-STM32自学成才系列教程之十四《点亮LCD液晶屏》

STM32入门系列教程点亮LCD液晶屏 Revision0.01 (2011-09-28)

原想把本期《点亮LCD液晶屏》教程放在《GPIO编程》之后,以提高大家的兴趣,但考虑到可能网友学习STM32,是想更多地了解STM32内部工作机制,因此在之前的教程,我们先介绍了串口、外部中断、定时器等最基本的外设模块,有了这些基础,相信您再来学习LCD液晶,已经很轻松了。 我们使用的是芯达STM32配套的2.4寸TFT液晶触摸屏,它是山寨手机上的触摸液晶屏,内部驱动IC为ILI9325。我们操作LCD,实际上就是在操作ILI9325。有关该芯片的资料,请参考如下两个网址: ILI9325指令说明(中文):https://www.sodocs.net/doc/ce4620766.html,/read.php?tid=142 考虑到“触摸”涉及到太多的原理,因此把触摸屏单独列出一期教程详细讲解。这里只讲述如何去点亮LCD液晶屏,如果您看完本期教程,能理解LCD驱动过程,那么笔者心满意足。 要驱动LCD,分两个部分讲解: 1、CPU内部模块支持的LCD接口(这里使用FSMC模块) 2、LCD控制电路 一、STM32的FSMC原理 如果是单片机,相信大家再熟悉不过了,直接拿P0或者P1口用作LCD数据总线,再另外拿出几个IO口用作控制信号线——一个LCD控制电路完成了。STM32相对于单片机,有啥过人之处呢? 对于STM32系列的CPU来说,有两种方法给LCD总线赋值。第一个方法,就是给对应的GPIOx_ODR寄存器赋值——这与单片机一样,单片机也是给P0-P3寄存器赋值,使得信号能从对应的IO端口输出。而STM32的另一种方法就是使用FSMC。FSMC全称“静态存储器控制器”。使用FSMC控制器后,我们可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线。 1、FSMC包括哪几个部分? FSMC包含以下四个模块: (1)AHB接口(包含FSMC配置寄存器) (2)NOR闪存和PSRAM控制器 (3)NAND闪存和PC卡控制器

STM32入门系列教程之十二《实时时钟RTC编程》

STM32入门系列教程实时时钟RTC编程 Revision0.01 (2010-04-27)

对于单片机转ARM的同学来说,RTC可能比较少接触。提到实时时钟,更经常想到的是DS1302。当然,在STM32里,自己一个CPU已经足够,不需要DS1302。 实际上,RTC就只一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。因为它掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。我们在本期教程中将详细讲述RTC原理及例程,以引导大家顺利进入RTC的世界。 1.STM32的RTC模块 RTC模块之所以具有实时时钟功能,是因为它内部维持了一个独立的定时器,通过配置,可以让它准确地每秒钟中断一次。下面就来看以下它的组成结构。 1.1RTC的组成 RTC由两个部分组成:APB1接口部分以及RTC核心部分(感觉说了等于没说,因为任何模块都会有接口部分和它自己的核心部分。请注意,权威的STM32系列手册是这么说的?)。笔者猜想原因可能是STM32所有的外设默认时钟无效,使用某个外设时,再开启时钟,用这样的方式来降低功耗。这里的RTC,APB1接口由APB1总线时钟来驱动。为了突出时钟吧?不过据说APB1接口部分还包括一组16位寄存器。 RTC核心部分又分为预分频模块和一个32位的可编程计数器。前者可使每个TR_CLK周期中RTC产生一个秒中断,后者可被初始化为当前系统时间。此后系统时间会按照TR_CLK周期进行累加,实现时钟功能。 1.2对RTC的操作 我们对RTC的访问,是通过APB1接口来进行的。注意,APB1刚被开启的时候(比如刚上电,或刚复位后),从APB1上读出来的RTC寄存器的第一个值有可能是被破坏了的(通常读到0)。这个不幸,STM32是如何预防的呢?我们在程序中,会先等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1,然后才开始读操作,这时候读出来的值就是OK的。 那么对RTC寄存器的写操作会不会有类似的情况呢?对于写操作,我们只要注意,每一次写操作,必须确保在前一次写操作完成后进行。这个“确保”,

STM32学习笔记

sw笨笨的STM32学前班教程之一:为什么是它 SW笨笨发表于2009年01月30日21:43 阅读(70) 评论(0) 分类:个人日记 举报 经过几天的学习,基本掌握了STM32的调试环境和一些基本知识。想拿出来与大家共享,笨教程本着最大限度简化删减STM32入门的过程的思想,会把我的整个入门前的工作推荐给大家。就算是给网上的众多教程、笔记的一种补充吧,所以叫学前班教程。其中涉及产品一律隐去来源和品牌,以防广告之嫌。全部汉字内容为个人笔记。所有相关参考资料也全部列出。:lol 教程会分几篇,因为太长啦。今天先来说说为什么是它——我选择STM32的原因。 我对未来的规划是以功能性为主的,在功能和面积之间做以平衡是我的首要选择,而把运算放在第二位,这根我的专业有关系。里面的运算其实并不复杂,在入门阶段想尽量减少所接触的东西。 不过说实话,对DSP的外设并和开发环境不满意,这是为什么STM32一出就转向的原因。下面是我自己做过的两块DSP28的全功能最小系统板,在做这两块板子的过程中发现要想尽力缩小DSP的面积实在不容易(目前只能达到50mm×45mm,这还是没有其他器件的情况下),尤其是双电源的供电方式和1.9V的电源让人很头疼。 后来因为一个项目,接触了LPC2148并做了一块板子,发现小型的ARM7在外设够用的情况下其实很不错,于是开始搜集相关芯片资料,也同时对小面积的AVR和51都进行了大致的比较,这个时候发现了CortexM3的STM32,比2148拥有更丰富和灵活的外设,性能几乎是2148两倍(按照MIPS值计算)。正好2148我还没上手,就直接转了这款STM32F103。与2811相比较(核心1.8V供电情况下),135MHz×1MIPS。现在用STM32F103,72MHz×1.25MIPS,性能是DSP的66%,STM32F103R型(64管脚)芯片面积只有2811的51%,STM32F103C型(48管脚)面积是2811的25%,最大功耗是DSP的20%,单片价格是DSP 的30%。且有更多的串口,CAP和PWM,这是有用的。高端型号有SDIO,理论上比SPI速度快。 由以上比较,准备将未来的拥有操作系统的高端应用交给DSP的新型浮点型单片机28335,而将所有紧凑型小型、微型应用交给STM32。 ——SW笨笨,2009年春节假期 sw笨笨的STM32学前班教程之二:怎么开发 SW笨笨发表于2009年01月30日22:03 阅读(89) 评论(0) 分类:个人日记 举报

相关主题