嵌入式:
以应用为中心,以专用计算机为基础,软硬件可裁剪
ARM
A系列芯片:高端芯片,实现人机互动
R系列:实现时效性
M系列:低端芯片,控制硬件设备,灯,风扇....
ROM\RAM
ROM(硬盘)
含有(flash、eeprom)
程序运行时,只读存储器
RAM(内存)
随机存储器
特殊功能寄存器:SFR(special functional register)
时钟
脉冲波(非常稳定,倍频,分频)
时钟源:产生时钟信号的东西
时钟是单片机的心脏
1.寄存器:存高低存二进制数据--触发器--需要时钟信号才能工作
2.定时器、计数器,需要时钟信号才能计数
STM32
全称:stm32F103C8T6
st:意法半导体
m:m系列
32:32位微控制器
F:芯片的子系列
103:增强功能系列
C:管脚48个
8:64byte flash容量
T:硬件封装系列
6:芯片的温度 35~80摄氏度
位运算:
<< >> & | ! ~ ^
清0和置1
点灯实现
时钟:一定的脉冲信号频率
作用:同意元器件的时效
时钟源:
HSI:内部高速时钟源
LSI:内部低速时钟源
HSE:外部高速
LSE:外部低速
输入输出方式:(管脚和设备之间)
输出:
复用:是除GPIO以外使用到引脚
复用开漏
复用推挽
推挽输出:可以管脚和设备之间输出高低电平,引脚电平自由决定
开漏输出:输出的高低电平不具备驱动能力
输入:
上拉:引脚悬空时输入高电平,可以被外部拉低
浮空:接受数据的时候用,引脚电平完全由外部决定(当引脚悬空时,电平未知)
下拉:引脚悬空时输入低电平,可以被外部拉高
模拟输入:接收模拟信号
1.开时钟
APB2 外设时钟使能寄存器
基地址:0x4002 1000 偏移地址:0x18 [4] 1 打开GPIOC的时钟
2.输入输出模式
GPIOC 输入输出
基地址:0x4001 1000 偏移地址:0x04 [23:20] 0x1 通用推挽速度10MHZ
3.输出高低电平
端口输出寄存器
基地址:0x4001 1000 偏移地址:0x0c [13] 0
根据原理图PC13是低电平触发( ̄︶ ̄)↗ ,左边有个电源,右边是低电平
中断实现
中断的机制是打断而不是同时,单进程的情况
中断:
事件一执行中,事件二产生,打断事件一执行事件二,事件二处理完成,继续执行事件一
则,事件二就为中断
外部中断、串口中断、定时器中断
NVIC(中断优先级)每一次有中断都要对NVIC进行设置
1.NVIC中断优先级分组
stm32有84个中断,包括 16个内核中断和68个可屏蔽中断,具有16级的可编程的中断优先级
中断管理:
寄存器AIRCR
库函数NVIC_PriorityGroupConfig
NVIC_PriorityGroup 先占优先级(抢占优先级) 从优先级(响应优先级) 描述
NVIC_PriorityGroup_0 没有 0-15 先占优先级 0 位,从优先级 4 位
NVIC_PriorityGroup_1 0-1 0-7 先占优先级 1 位,从优先级 3 位
NVIC_PriorityGroup_2 0-3 0-3 先占优先级 2 位,从优先级 2 位
NVIC_PriorityGroup_3 0-7 0-1 先占优先级 3 位,从优先级 1 位
NVIC_PriorityGroup_4 0-15 没有 先占优先级 4 位,从优先级 0 位
注意:不设置优先级分组时,默认为NVIC_PriorityGroup_0
注意: 当 2(n)个相同抢先优先级和相同子优先级的中断同时出现,STM32 响应中断通道
所对应的中断向量地址低的那个中断。(中断向量表见:stm32中文参考手册p132)
注意:高抢占才能打断低抢占
注意(强调):优先级分组(该函数)只能设置一次
EXTI (外部中断)
16条中断线,每条都能触发中断
实验:通过k2(PA15)触发外部中断实现灯的点亮和熄灭
以下为外部中断的实现步骤:
1.打开复用功能和GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
2.引脚GPIO初始化
GPIO_Init()
3.映射GPIO引脚和对应的外部中断线
GPIO_EXTILineConfig()
4.外部中断初始化
EXTI_Init()
typedef struct
{
u32 EXTI_Line; //中断线
EXTIMode_TypeDef EXTI_Mode; //中断模式
EXTIrigger_TypeDef EXTI_Trigger; //触发方式
FunctionalState EXTI_LineCmd; //使能
} EXTI_InitTypeDef;
5.配置中断优先级
NVIC_Init()
typedef struct
{
u8 NVIC_IRQChannel; //中断通道
u8 NVIC_IRQChannelPreemptionPriority; //抢占优先级
u8 NVIC_IRQChannelSubPriority; //响应优先级
FunctionalState NVIC_IRQChannelCmd; //通道使能
} NVIC_InitTypeDef;
6.编写中断处理函数
void EXTI15_10_IRQHandler(void)(不同的中断线,中断处理函数是不同的)
#ifndef __LED_H
#define __LED_H
void led_init(void);
void led_on(void);
void led_off(void);
#endif
#include "stm32f10x.h" // Device header
#include "led.h"
void delay(int n)
{
int i;
while(n--)
for(i=0; i<8050; i++);
}
int main()
{
led_init();
while(1)
{
led_on();
delay(1000);
led_off();
delay(1000);
}
}
#include "led.h"
#include "stm32f10x.h" // Device header
void led_init(void)
{
//1打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//2设置输入输出模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void led_on(void)
{
//低电平点灯
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}
void led_off(void)
{
//高电平关灯
GPIO_SetBits(GPIOC, GPIO_Pin_13);
}