一.代碼燒寫
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 }