STM32F103是ST公司生产的Cortex-M3内核微控制器,性价比高,应用广泛。
芯片简介
STM32F103系列是ST意法半导体推出的基于ARM Cortex-M3内核的32位微控制器,主频72MHz,集成丰富的外设资源。
主要特性
- 内核: ARM Cortex-M3 32-bit RISC
- 主频: 72MHz
- 闪存: 64KB-128KB
- SRAM: 20KB
- 外设: GPIO, USART, SPI, I2C, ADC, DMA, Timer, PWM
- 供电: 2.0V - 3.6V
开发环境
硬件准备
-103开发板
- ST STM32F-Link下载器
- 串口模块
- 面包板及杜邦线
软件工具
1 2 3 4 5 6 7 8
| sudo apt-get install gcc-arm-none-eabi
sudo apt-get install openocd
sudo apt-get install stlink-tools
|
项目结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Project/ ├── Core/ │ ├── Inc/ │ │ ├── main.h │ │ ├── stm32f1xx_hal.h │ │ └── stm32f1xx_it.h │ └── Src/ │ ├── main.c │ ├── stm32f1xx_it.c │ └── system_stm32f1xx.c ├── Drivers/ │ ├── CMSIS/ │ └── STM32F1xx_HAL_Driver/ ├── Makefile └── STM32F103C8TX_FLASH.ld
|
基础例程
1. GPIO控制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include "stm32f10x.h"
void GPIO_Init(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; GPIOA->CRL &= ~0x0000000F; GPIOA->CRL |= 0x00000003; }
void LED_On(void) { GPIOA->ODR |= (1 << 0); }
void LED_Off(void) { GPIOA->ODR &= ~(1 << 0); }
int main(void) { GPIO_Init(); while(1) { LED_On(); Delay(500); LED_Off(); Delay(500); } }
|
2. 串口通信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include "stm32f10x.h"
void USART1_Init(void) { RCC->APB2ENR |= RCC_APB2ENR_USART1EN; RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; GPIOA->CRH &= ~0x00000FF0; GPIOA->CRH |= 0x00000B10; USART1->BRR = 72000000 / 115200; USART1->CR1 |= USART_CR1_TE | USART_CR1_RE; USART1->CR1 |= USART_CR1_UE; }
void USART_SendByte(uint8_t ch) { while(!(USART1->SR & USART_SR_TXE)); USART1->DR = ch; }
void USART_SendString(char *str) { while(*str) { USART_SendByte(*str++); } }
|
3. 定时器中断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| void TIM2_Init(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2->PSC = 7200 - 1; TIM2->ARR = 10000 - 1; TIM2->DIER |= TIM_DIER_UIE; TIM2->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(TIM2_IRQn); }
void TIM2_IRQHandler(void) { if(TIM2->SR & TIM_SR_UIF) { TIM2->SR &= ~TIM_SR_UIF; } }
|
4. PWM输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void PWM_Init(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; GPIOA->CRL &= ~0x0F000000; GPIOA->CRL |= 0x0B000000; TIM3->PSC = 72 - 1; TIM3->ARR = 1000; TIM3->CCR1 = 500; TIM3->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; TIM3->CCER |= TIM_CCER_CC1E; TIM3->CR1 |= TIM_CR1_CEN; }
|
总结
STM32F103适合作为入门级单片机学习,资料丰富,生态完善。通过本指南的学习,你可以掌握STM32的基本开发流程,为更复杂的项目打下坚实基础。