CH32F103C8T6使用

烧录

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 的文件是源文件,内含函数实现,变量定义等内容。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值