一.代码烧写
1.需要工具
- STM32f103c8t6板子
- USB转串口
- PC上安装CH340驱动
2.引脚连接
- USB的GND接stm32的GND
- USB的3.3V接stm32的3.3
- USB的RXD接stm32的A9(USART1_TX)
- USB的TXD接stm32的A10(USART1_RX)
3.下载流程
- USB连接到板子和PC上
- 将板子的BOOT0置1,BOOT1置0使用Bootloader方式
- PC上打开FlyMCU工具选择烧写程序编译后的hex文件,正确配置点击开始编程,然后按板子上的复位键即可烧写成功
4.程序
- 利用串口输出CRC计算结果
1 /*********************************************************************************************
2 模板制作: 杜洋工作室/洋桃电子
3 程序名: CRC功能测试程序
4 编写人: 杜洋
5 编写时间: 2018年7月21日
6 硬件支持: 洋桃1号开发板 STM32F103C8 外部晶振8MHz RCC函数设置主频72MHz
7
8 修改日志:
9 1-
10
11
12 说明:
13 # 本程序是在洋桃1号开发板的硬件基础上编写的,移植需了解硬件接口差异。
14 # 本模板加载了STM32F103内部的RCC时钟设置,并加入了利用滴答定时器的延时函数。
15 # 可根据自己的需要增加或删减。
16
17 *********************************************************************************************/
18 #include "stm32f10x.h" //STM32头文件
19 #include "sys.h"
20 #include "delay.h"
21 #include "usart.h"
22
23
24 int main (void){//主程序
25 u32 a,b;
26 u8 c;
27 u32 y[3]={0x87654321,0x98765432,0x09876543};
28 delay_ms(500); //上电时等待其他器件就绪
29 RCC_Configuration(); //系统时钟初始化
30
31
32 USART1_Init(115200); //串口初始化(参数是波特率)
33 printf("Test USART, "); //
34
35 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//开启CRC时钟
36
37 while(1){
38 CRC_ResetDR();//复位CRC,需要清0重新计算时先复位
39 CRC_CalcCRC(0x12345678);//CRC计算一个32位数据。参数:32位数据。返回值:32位计算结果
40 CRC_CalcCRC(0x23456789);//CRC计算一个32位数据。参数:32位数据。返回值:32位计算结果
41 a = CRC_CalcCRC(0x34567890);//CRC计算一个32位数据。参数:32位数据。返回值:32位计算结果
42 printf("a = %d, ",a); //
43
44 CRC_ResetDR();//复位CRC,需要清0重新计算时先复位
45 b = CRC_CalcBlockCRC(y,3);//CRC计算一个32位数组。参数:32位数组名,数组长度。返回值:32位计算结果
46 printf("b = %d, ",b); //
47
48 CRC_SetIDRegister(0x5a);//向独立寄存器CRC_IDR写数据。参数:8位数据。
49 c = CRC_GetIDRegister();//从独立寄存器CRC_IDR读数据。返回值:8位数据。
50 printf("c = %d, ",c); //
51
52 CRC_ResetDR();
53 printf("ResetDR => CRC_GetCRC() = %d, CRC_GetIDRegister() = %d ",CRC_GetCRC(),CRC_GetIDRegister());
54
55
56 //此时,a存放的是3个独立数的CRC结果。(32位)
57 //b存放的是数组y中3个数据CRC计算结果。(32位)
58 //c存放的是我们写入的独立寄存器数据0x5a。(8位)
59 delay_ms(5000);
60 }
61 }
62
63 // 以下是CRC固件库函数,可在主程序中直接调用 //
64
65 // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//开启CRC时钟,主程序开始时调用
66 // CRC_ResetDR();//复位CRC,需要清0重新计算时先复位
67 // uint32_t CRC_CalcCRC(uint32_t Data);//CRC计算一个32位数据。参数:32位数据。返回值:32位计算结果
68 // uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength);//CRC计算一个32位数组。参数:32位数组名,数组长度。返回值:32位计算结果
69 // uint32_t CRC_GetCRC(void);//从CRC中读出计算结果。返回值:32位计算结果。
70
71 // void CRC_SetIDRegister(uint8_t IDValue);//向独立寄存器CRC_IDR写数据。参数:8位数据。
72 // uint8_t CRC_GetIDRegister(void);//从独立寄存器CRC_IDR读数据。返回值:8位数据。
73
74
75 /*********************************************************************************************
76 * 杜洋工作室 www.DoYoung.net
77 * 洋桃电子 www.DoYoung.net/YT
78 *********************************************************************************************/
79 /*
80
81 【变量定义】
82 u32 a; //定义32位无符号变量a
83 u16 a; //定义16位无符号变量a
84 u8 a; //定义8位无符号变量a
85 vu32 a; //定义易变的32位无符号变量a
86 vu16 a; //定义易变的 16位无符号变量a
87 vu8 a; //定义易变的 8位无符号变量a
88 uc32 a; //定义只读的32位无符号变量a
89 uc16 a; //定义只读 的16位无符号变量a
90 uc8 a; //定义只读 的8位无符号变量a
91
92 #define ONE 1 //宏定义
93
94 delay_us(1); //延时1微秒
95 delay_ms(1); //延时1毫秒
96 delay_s(1); //延时1秒
97
98 GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED控制
99
100 */
二.CRC
1.介绍
- 主要用作传输数据时验证数据是否准确
- 将数据和通过CRC计算的结果一起发送给接收方
- CRC功能挂在在AHB总线上,拥有32位的CRC计算寄存器和8位独立用户寄存器
- 当读取数据时会通过CRC计算返回计算结果,CRC复位时计算寄存器重置,独立用户寄存器保持不变(由上面结果显示)
三.芯片ID
1.概述
2.三种方式读取
- 8位,16位和32位方式读取
- 大端和小端方式读取芯片地址
3.程序编写
1 int main (void){//主程序
2 u32 ID[3];
3 delay_ms(500); //上电时等待其他器件就绪
4 RCC_Configuration(); //系统时钟初始化
5 KEY_Init();//KEY
6
7 USART1_Init(115200); //串口初始化(参数是波特率)
8
9 printf("STM32F103 ");
10 ID[0] = *(__IO u32 *)(0X1FFFF7E8); //读出3个32位ID 高字节
11 ID[1] = *(__IO u32 *)(0X1FFFF7EC); //
12 ID[2] = *(__IO u32 *)(0X1FFFF7F0); // 低字节
13
14 printf("ChipID: %08X %08X %8X \r\n",ID[0],ID[1],ID[2]); //从串口输出16进制ID
15
16 if(ID[0]==0x066EFF34 && ID[1]==0x3437534D && ID[2]==0x43232328){ //检查ID是否匹配
17 printf("chipID OK! \r\n"); //匹配
18 }else{
19 printf("chipID error! \r\n"); //不同
20 }
21
22 while(1){
23
24 }
25 }