ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32三:STM32代码烧写、CRC串口输出及芯片ID

2022-09-10 19:33:03  阅读:244  来源: 互联网

标签:32 printf 烧写 STM32 CRC 计算结果 串口 返回值 ID


一.代码烧写

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 }

 

标签:32,printf,烧写,STM32,CRC,计算结果,串口,返回值,ID
来源: https://www.cnblogs.com/zhihaospace/p/15840618.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有