STM32 点灯实现 7.18

嵌入式:

以应用为中心,以专用计算机为基础,软硬件可裁剪

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

STM32 点灯实现 7.18_第1张图片

根据原理图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);

}

你可能感兴趣的:(STM32,stm32,单片机,嵌入式硬件)