烧录
WCHISPTool 工具:
1)BOOT0 接 VCC,BOOT1 接地,通过串口或者 USB 连接 PC;
2)打开 WCHISPTool 工具,选择相应下载方式,选择下载固件,勾选芯片配置,点击 下载;
3)BOOT0 接地,重新上电,运行 APP 程序。BOOTO
接口初识
RCC
Reset and clock control (RCC)
时钟配置,控制提供给各模块时钟信号的通断
5 个时钟源,分别是 HSI 、 HSE 、 LSI 、 LSE 、 PLL 。
①HSI 是高速内部时钟, RC 振荡器,频率为 8MHz ;
②HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时钟源,频率范围是 4MHz – 16MHz ;
③LSI 是低速内部时钟, RC 振荡器,频率为 40KHz ;
④LSE 是低速外部时钟,接频率为 32.768KHz 的石英晶体;
⑤PLL 为锁相环倍频输出,严格的来说并不算一个独立的时钟源, PLL 的输入可以接 HSI/2 、 HSE 或者 HSE/2 。PLL倍频可选择为 2 – 16 倍,但是其输出频率最大不得超过 72MHz 。
APB
APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、USART2、USART3、UART4、UART5、SPI2、SP3等;
APB2上面连接的是高速外设,包括UART1、SPI1、Timer1、ADC1、ADC2、ADC3、所有的普通I/O口(PA-PE)、第二功能I/O(AFIO)口等。
GPIO:General Purpose Input Output,通用输入/输出端口
输出模式:
推挽输出:电平0V和3.3V,用于高速切换开关
开漏输出:通过I^2C,SMBUS通信
频率:频率越高功耗越高,2MHz,10MHz,50MHz,
GPIO(A-E) _(0-15 ) GPIO有A到E,引脚有0到15
建立结构体建立端口信息块
示例:
GPIO_Init Type Def GPIO_Init Structure; /定义一个GPIO_Init Type Def类型的结构体,
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //选择控制的引脚5
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置引脚模式推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //端口速率为50MHz
GPIO_Mode 输入模式
typedef enum
{ //输入
GPIO_Mode_AIN = 0x0, // 模拟输入(AIN)ADC 连接模拟输入,收集0-Vss的电压
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入(IN)未设置时的模式,电平有外部信号决定
GPIO_Mode_IPD = 0x28, // 下拉输入(IPD)默认低电平,去检测高电平
GPIO_Mode_IPU = 0x48, // 上拉输入(IPU)默认高电平,当独立按键按下时为才为低电平
//输出
GPIO_Mode_Out_OD = 0x14, // 开漏输出(Out_OD ) 默认只有低电平,高电平靠上拉电阻输出
GPIO_Mode_Out_PP = 0x10, // 推挽输出(Out_PP) 高电平输出(3.3V) 电压电流输出最大
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出(AF_OD )外加上拉电阻,用更大电压
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出(AF_PP )复用即可作为USART IIC SPI等
}GPIOMode_TypeDef;
GPIO_Speed 输入速率
输出最大频率选择 频率越高,需要它变换电平时就越快,频率低可用于点亮LED节省功耗,频率高可用于串口通信
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \
((SPEED) == GPIO_Speed_50MHz))
GPIO_Pin定义引脚
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */ //所有引脚
启用GPIO端口时钟
GPIO都是挂在APB2总线上的,调用APB2上GPIO端口时钟(Clock)才能使用
RCC_APB2PeriphClockCmd()开启或关闭APB2外设时钟
参1调用哪一个GPIO,参数2开启ENABLE或关闭DISABLE
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
初始化端口
GPIO_Init()//初始化函数 A-E
参数1为哪个引脚( A-E),参数2为哪个结构体地址
GPIO_Init(GPIOB,&GPIO_InitStructure))
调整电平
参1调用哪一个GPIO,参2调整哪一个引脚
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 输出1高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 复位输出0低电平
GPIO_ReadOutputDataBit :读取指定端口管脚的输出。
GPIO_ReadInputDataBit :读取指定端口管脚的输入。
uint数据类型
int和uint的区别:一个有符号,一个无符号。
uint在单片机中经常用到,定义一个无符号整型变量。
以*_t结尾的类型
1字节 uint8_t
2字节 uint16_t
4字节 uint32_t
8字节 uint64_t
输入和输出
Pcout(n)和 Pcin(n)
Pcout是输出 ,用IO驱动Led、电机等,提供一个高或低电平对外设进行控制。这种叫输出
Pcin是输出,IO做按键等,外设状态出现变化,MCU通过IO检测。这种叫输入
PBout(7) = 1; 1输出高电平
延时函数
void Delay(uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
Delay(0xfffff);
根据板子上晶振知道时钟频率为12MHz(=0.08us=0.1us)
震荡周期=1/晶振(12.000MHZ)
一次 i--=12T 单位us
//使用固件库点亮LED
2 int main(void)
3 {
4 //定义一个GPIO_Init Type Def类型的结构体
5 GPIO_Init Type Def GPIO_Init Structure;
6
7 //开启GPIO端口时钟
8 RCC_APB2ENR |= (1<<3);
9
10 //选择要控制的GPIO引脚
11 GPIO_Init Structure.GPIO_Pin = GPIO_Pin_0;
12
13 //设置引脚模式为通用推挽输出
14 GPIO_Init Structure.GPIO_Mode = GPIO_Mode_Out_PP;
15
16 //设置引脚速率为50MHz
17 GPIO_Init Structure.GPIO_Speed = GPIO_Speed_50MHz;
18
19 //调用库函数,初始化GPIO引脚
20 GPIO_Init(GPIOB, &GPIO_Init Structure);
21
22 //使引脚输出低电平,点亮LED1
23 GPIO_Reset Bits(GPIOB,GPIO_Pin_0);
24
25 while (1)
26 {
27 //使引脚输出低电平,点亮LED
28 GPIO_Reset Bits(GPIOB,GPIO_Pin_0);
29
30 /*延时一段时间*/
31 Delay(0x FFFF);
32
33 /*使引脚输出高电平,关闭LED1*/
34 GPIO_Set Bits(GPIOB,GPIO_Pin_0);
35
36 /*延时一段时间*/
37 Delay(0x FFFF);
38 }
39 }
I^2C:
SPI:
USART
认识文件
后缀为 .h 的文件是头文件,内含函数声明、宏定义、结构体定义等内容
后缀为 .c 的文件是源文件,内含函数实现,变量定义等内容。