1、环境 STM32F107RC核心板 + Atollic TrueStudio + Win8.1 2、STM32F1系列单片机分类打开参考手册第三章,可以获知:不同储存容量的单片机有不同的FLASH分布,而主要分为以下几类。1、low-density,2、medium-density,3、high-density,4、connectivity line。我们需要根据使用的单片机容量,确认其FLASH分布。 下图中,Table 3是STM32F107RC规格书上的关于兼容性的描述。从这里以及规格书上文描述,我们可以知道: STM32F107RC属于connectivity line。 . H0 U, H# w& E6 E6 B8 m
' g' ^7 F! Q1 d7 d 3、硬石STM32F1开源的源代码3.1 stm32f107_flash.c- /**
5 B" `0 O( f& u: F1 L/ q - ******************************************************************************' Z. `: ]+ E: N" r, {4 \: W1 W/ N
- * 文件名程: stm_flash.c # `0 Q4 s4 ] s0 u
- * 作 者: 硬石嵌入式开发团队
2 m2 o6 T6 w, J+ N - * 版 本: V1.0" x' A6 A, J, f/ S V
- * 编写日期: 2015-10-04
; x _- [6 }# \ J+ w9 L. y% u - * 功 能: 内部Falsh读写实现
3 j% _) @4 o4 k2 k5 K - ******************************************************************************
/ X. t3 e$ G( E0 O* L - * 说明:
! o& i) ]3 g, C; P) b - * 本例程配套硬石stm32开发板YS-F1Pro使用。
: `; Q0 B& A7 e) s - *
, V0 I& N; I6 W - * 淘宝:
" _% Y7 T3 J+ d7 K/ B - * 论坛:http://www.ing10bbs.com
1 K9 a* [5 U. M S f - * 版权归硬石嵌入式开发团队所有,请勿商用。
, n7 | Q4 I# i5 p/ ]+ N$ }% l; { - ******************************************************************************
& m# {# B3 f% w* f p9 s - */* n/ ^* K) J# s" K' \
- /* 包含头文件 ----------------------------------------------------------------*/0 Q$ Q* P* A8 x: C! R
- #include "stm32f107_flash.h"1 s( y$ b' F5 q, B5 z" ^: K
- & R4 R7 j0 P: X% v
- /* 私有类型定义 --------------------------------------------------------------*/
; N1 A6 _( C9 A5 D8 `; G: ~: Q! p - /* 私有宏定义 ----------------------------------------------------------------*/3 Q5 X! ]) Q( b) l k
- #if STM32_FLASH_SIZE < 256) Z L! I y+ C
- #define STM_SECTOR_SIZE 1024 //字节
7 k) J, b6 z# M' x$ ~3 A - #else
" L1 m* z5 F' m4 w2 u3 j) n0 b - #define STM_SECTOR_SIZE 2048$ q! l# ?( `- E: `3 Y4 x4 h+ ?: q
- #endif
, |4 v$ {# F2 ^8 r2 ]7 `& _ -
% Q- M# A; }0 u% b# R# p" H y - 1 {# I4 k! Z- `% c
- /* 私有变量 ------------------------------------------------------------------*/, g1 O, [2 m5 ?6 A: Y( J; U
- #if STM32_FLASH_WREN //如果使能了写 # D. k+ L: ^; i+ f, M0 n+ Z
- static uint16_t STMFLASH_BUF [ STM_SECTOR_SIZE / 2 ];//最多是2K字节
& |5 a% @7 r, I - static FLASH_EraseInitTypeDef EraseInitStruct;
0 {3 ^1 V- o6 ?$ q; C/ i, q- t - #endif6 D2 I; x# g A* v: R6 u% m
- . ^. C9 x: g/ L6 y
- /* 扩展变量 ------------------------------------------------------------------*/
$ ^# e: w7 ^: q7 S5 k9 L - /* 私有函数原形 --------------------------------------------------------------*/
6 S5 t( \. n* ~* v% @! W, g8 i/ L - /* 函数体 --------------------------------------------------------------------*/6 b/ u' W7 _# D- k2 w4 f
- /**, ^7 v8 ~! @$ `; Y2 C4 |
- * 函数功能: 读取指定地址的半字(16位数据)
' J2 w6 t6 j7 ^ - * 输入参数: faddr:读地址(此地址必须为2的倍数!!)
3 n" M! \$ e2 r6 D. w; b4 ? - * 返 回 值: 返回值:对应数据.# E- S) I: q* P* `' S
- * 说 明:无
$ n# O% j, P t5 z/ ~! @ - */" ~9 ^, d4 e; E: Z+ {
- uint16_t STMFLASH_ReadHalfWord ( uint32_t faddr )" i6 E4 C I- G
- {* N* X# o$ X' E* g; P
- return *(__IO uint16_t*)faddr; . r+ j7 y* |/ D: Z' V
- }
* E* v! [/ J! B! M2 X# P -
; |, {: r4 \$ I7 ~ - #if STM32_FLASH_WREN //如果使能了写 6 d2 r* ]; [ F4 z4 w4 u8 R: n
- /**: I0 B" z4 v2 A( r3 \: F
- * 函数功能: 不检查的写入
- ^1 W1 Z+ y4 a2 h, S - * 输入参数: WriteAddr:起始地址' N/ m& g7 a4 u+ [7 b; h
- * pBuffer:数据指针
5 I8 C. G! N9 f/ t3 x' e6 i' D - * NumToWrite:半字(16位)数7 H/ E w3 z9 ~/ x9 j6 O, a0 y2 R- M
- * 返 回 值: 无
6 a! E: r8 m4 V( t - * 说 明:无
$ f" U( z. `/ b - */
$ C2 i$ |, V0 _7 F. M% l - void STMFLASH_Write_NoCheck ( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite ) 3 ^' C* Y8 W: A7 x q2 I
- { 2 s D: v& g4 V' C
- uint16_t i;5 }" P) a0 u! |! _
- & T, c4 c- N- V8 s( b
- for(i=0;i<NumToWrite;i++)
5 t% E6 `+ [$ ?! N - {9 c+ }3 n/ K& d. j
- HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,WriteAddr,pBuffer[i]);
5 Y7 P* E/ V3 l3 \) X x0 R - WriteAddr+=2; //地址增加2.
# n( R9 {) C' M2 b& l8 |" a - }
4 Y; J0 ]. q+ [* G6 W - } + d+ C7 H7 N8 D' H% H
-
) F T. T4 v- L ~* M% M E - /**/ N: N8 {# N0 Z+ l9 G- t2 T% t5 }: A
- * 函数功能: 从指定地址开始写入指定长度的数据& B* F1 Z1 t( z8 M0 A% P1 V
- * 输入参数: WriteAddr:起始地址(此地址必须为2的倍数!!)/ X# @" i9 R4 g7 I, W7 n& l
- * pBuffer:数据指针( B8 X8 G8 U+ z* T3 h
- * NumToWrite:半字(16位)数(就是要写入的16位数据的个数.)
) f l' r4 H/ y8 Q, B" v; R0 w9 r% T - * 返 回 值: 无0 `+ C1 M! W9 W( H$ |, i; W
- * 说 明:无
# T. i6 u, R0 O+ _! {3 a& C5 } - */$ e0 L3 {# k* u% E }, S
- void STMFLASH_Write ( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite ) ; _+ s+ p Z* V. A
- {4 \" o9 X2 U7 T7 i: \, r* V( ?0 I7 G
- uint32_t SECTORError = 0;
2 G: v, z" H" H- v - uint16_t secoff; //扇区内偏移地址(16位字计算)
# C* h- l* ?5 G7 c; J1 p - uint16_t secremain; //扇区内剩余地址(16位字计算)" ~+ x( o; ?% l3 C7 c
- uint16_t i;: ^: }6 U; w" s5 P; x( S
- uint32_t secpos; //扇区地址6 `6 J- H9 T& i6 m) T
- uint32_t offaddr; //去掉0X08000000后的地址4 R1 y3 [6 ?( X3 T& K ~
- 2 ]' W. I: ?, L7 _/ t6 Q
- if(WriteAddr<FLASH_BASE||(WriteAddr>=(FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
. b* R. N4 U7 l -
2 |+ O, }- Q9 q# r) O - HAL_FLASH_Unlock(); //解锁
& n' h9 i K! R- i* L( I- W -
8 K( \/ }8 }- T; A) N - offaddr=WriteAddr-FLASH_BASE; //实际偏移地址.
. s) _, y( p% @3 O) d6 R" x - secpos=offaddr/STM_SECTOR_SIZE; //扇区地址 0~127 for STM32F103RBT6
6 t, k9 J" P# D ^ - secoff=(offaddr%STM_SECTOR_SIZE)/2; //在扇区内的偏移(2个字节为基本单位.), C5 m" b7 M6 F6 I9 j
- secremain=STM_SECTOR_SIZE/2-secoff; //扇区剩余空间大小; V- o. _: V! e
- if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围6 @* _4 A% w; r, K6 i
-
9 C# }8 Y& N* `6 V- N7 f8 ` - while(1)
* A- z, W# j4 S: b! m; S; u- X/ A - {7 H1 o' n! W! x5 _5 B
- STMFLASH_Read(secpos*STM_SECTOR_SIZE+FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容' w2 U1 s. `* m. l0 P
- for(i=0;i<secremain;i++)//校验数据
; M/ A7 F& q0 z+ C - {/ o; N. N7 l/ H. h
- if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除# U" L. ?5 M" b3 K* p7 w7 b: T
- }
: ?6 A( `2 }& W7 |# S4 N. N - if(i<secremain)//需要擦除
- {) l d/ p# E1 o1 B7 a - {
( W+ S0 x: ]2 s - //擦除这个扇区
1 U* y' d( S$ T$ @2 H - /* Fill EraseInit structure*/% c+ Q& ~9 {* n6 j3 Y: N
- EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
7 t3 |4 c3 v' H- g5 s0 U+ { - EraseInitStruct.PageAddress = secpos*STM_SECTOR_SIZE+FLASH_BASE;
" {9 D7 b* S" G2 r ` - EraseInitStruct.NbPages = 1;0 X1 R {* @+ _7 ^5 r" E9 K5 H" F
- HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError);9 D# i: J, u0 R& X7 g
- % R0 D% w# |1 F. N) n
- for(i=0;i<secremain;i++)//复制' z' `! Y2 n8 c- K2 o! [, ^& x
- {5 X! |. W0 E1 v T
- STMFLASH_BUF[i+secoff]=pBuffer[i];5 \3 _; [9 x; u/ G* A
- }
3 v& ]: O5 J# X o% y - STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区& K# d2 G. c1 q _! C) I
- }
+ x! P/ E1 z7 |* d5 J; e5 x' f$ C - else
$ Q& @! T7 G, T. }+ R+ y. E$ o. H - {
d r0 p* Q2 |: K - STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.
: I1 i! V* F8 v/ g/ r+ `( ? - }
M/ P$ p4 g5 Y1 S5 s5 U" L - if(NumToWrite==secremain)break;//写入结束了
# H& k" d$ c; @ - else//写入未结束
; f7 }- o9 a4 g! S$ x! q, q7 G - {, g6 K- \7 k% l2 s, p
- secpos++; //扇区地址增1# }( ]3 T( q' {" Y0 W* O, y
- secoff=0; //偏移位置为0
% i0 ?8 |4 n! _2 {6 L; { - pBuffer+=secremain; //指针偏移
. a! o, `1 Q$ g+ v - WriteAddr+=secremain; //写地址偏移4 Q% s; C2 G$ k5 Y
- NumToWrite-=secremain; //字节(16位)数递减
& w9 j0 \+ Q' P6 o1 w! V9 ^2 L, B - if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
. ~( R% V" z$ t - else secremain=NumToWrite;//下一个扇区可以写完了8 \4 B/ L- I6 c. u( ]6 A
- }
, v: y% U7 B" h0 z5 @ - };1 ~$ R: c- N* c
- HAL_FLASH_Lock();//上锁% W# h/ j! r0 h- u: S' P& D3 s
- }5 B- m. ^; J. }; h- s
-
7 a, D$ J4 Z0 ?. L5 O - 1 J+ P/ G1 H) N, Y- [
-
, U, r1 z; t8 i3 Q - #endif
. M, Y+ ]! Q4 b( x3 a- v Z o -
9 ]/ P* \$ Y# D! D - /**
4 c4 X: ?+ A0 H: D \ - * 函数功能: 从指定地址开始读出指定长度的数据$ h& c4 q' u% }4 `
- * 输入参数: ReadAddr:起始地址' O1 N& Q n( l" J. K3 c
- * pBuffer:数据指针
: a! u8 J/ E: \4 u# q - * NumToRead:半字(16位)数, Y3 y% Y6 M! v1 Z% V8 v
- * 返 回 值: 无9 D3 }: U2 I) _
- * 说 明:无
J* ~' T! }1 |3 s! j! \ - */) j& E* ^0 i4 m) t7 X
- void STMFLASH_Read ( uint32_t ReadAddr, uint16_t *pBuffer, uint16_t NumToRead )
- |( z8 G8 P% U1 u. N; \, m - {
0 J$ @0 ^$ i5 D' h( M$ n$ M - uint16_t i;
8 M* S' z2 d9 \) S6 w' r) r" K -
* F$ B& N @( ]0 o" W! v - for(i=0;i<NumToRead;i++)
+ _3 x: {; N# u! Z. b; p - {: d2 T9 y4 L+ J4 v9 j9 K. H, }
- pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
# g2 E# ?" Y0 x, h( K5 ~ - ReadAddr+=2;//偏移2个字节.
+ x; E4 C3 N9 Q0 x; D2 G; ~2 _ - }* q1 ^# v6 H o- Q# ? K5 l
- }' E" T8 k, D2 W# B4 ]8 I
- 8 V5 Y* y% |9 X; e& {4 s6 x
- /*
# e5 K( H, I$ m7 t2 U/ F - * 函数名:Buffercmp
^) Z) ^, U# t% a; p - * 描述 :比较两个缓冲区中的数据是否相等
& D. Q% N1 W7 s6 }% z3 V - * 输入 :-pBuffer1 src缓冲区指针
; v7 w6 D4 f/ \6 D. W) B - * -pBuffer2 dst缓冲区指针
/ P1 @' k" [2 K: O& R - * -BufferLength 缓冲区长度
1 s+ f1 K6 a& ~: v2 \ - * 输出 :无
$ p; b! ]% T& ~$ r9 Z9 y3 k - * 返回 :-PASSED pBuffer1 等于 pBuffer2" g- P; b N+ d! ~
- * -FAILED pBuffer1 不同于 pBuffer2
. o& f9 ~& W) g- c, m( [$ q6 X- r @ - */
+ ]9 J3 b% Q7 o0 e$ U - TestStatus Buffercmp(uint16_t* pBuffer1, uint16_t* pBuffer2, uint16_t BufferLength)
0 X f$ q# U, E; C. W - {
, o& s9 q4 }& c - while(BufferLength--)
* H2 c5 q: T2 _- E6 ~. t( K - {
! U, J9 Z" I- O9 j( [; ? - printf("data:%d - %d \n",*pBuffer1 , *pBuffer2);. F+ D9 x: z2 w$ {5 i8 Y) a' V3 V
- if(*pBuffer1 != *pBuffer2)! l; e) I! c$ S+ M9 `1 ~, L
- {- k7 J6 {! G u4 d7 i, [1 S8 v: l
- return FAILED;$ r( u; m7 u/ g0 d& B
- }0 x) ^% D& T+ q7 g3 S
- " O1 l; Q! Z/ W) Z% g
- pBuffer1++;
+ H. G5 A( y6 L1 k/ Y2 ^2 P - pBuffer2++;9 T8 L8 y8 u( a6 o
- }
. u |5 a4 `4 p7 i - return PASSED;
: m# a+ O$ e# w+ R- e - }
9 \2 ]& Z& m' i9 z" Z6 x$ ] - : |+ C. V; ^* O% h
- ' D7 F$ q5 J: e
- /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码 & m& z! x- j) U/ n$ L, j6 c. a5 n% P
3.2 stm32f107_flash.h
( Q) N' l: \5 m' A- #ifndef __STMFLASH_H__' F- f. @/ C2 I/ U6 v3 H/ x
- #define __STMFLASH_H__, A( u; x% \# A. [6 O
-
6 Y& `! t! D) y# f: g( Y - /* 包含头文件 ----------------------------------------------------------------*/- g6 C: b2 q, l* U/ Z" x$ X
- #include "stm32f1xx_hal.h"
' F. b2 Q) ^4 S$ Q8 { - $ }9 _; O0 Q( m
- /* 类型定义 ------------------------------------------------------------------*/
; F* ~# |# f; y$ r/ p2 p - /* 宏定义 --------------------------------------------------------------------*/
6 F! ]' P6 [0 D* s' {2 | - /************************** STM32 内部 FLASH 配置 *****************************/
) C9 m* b/ r$ D& r" u4 X- y - #define STM32_FLASH_SIZE 256 // 所选STM32的FLASH容量大小(单位为K). x1 l7 k5 l) s
- #define STM32_FLASH_WREN 1 // stm32芯片内容FLASH 写入使能(0,禁用;1,使能). v1 y! X5 X" E
-
d- E8 C7 W" | - typedef enum
/ s5 ]& S/ R* | - {
2 _, \; j: M. q% z# x, { - FAILED = 0,3 ]7 ^6 Q7 l$ M" k
- PASSED = !FAILED! i [( c2 y, N- k) Q& N
- }TestStatus;
5 x# H; }( y" w$ i+ q -
- u, Q4 x* ^1 ~' u0 |! B9 Q - #define FLASH_WriteAddress 0x0803F800 // 写在靠后位置,防止破坏程序
0 Z. c1 X" `. k% q. i9 a9 h - #define FLASH_ReadAddress FLASH_WriteAddress+ o( A2 c# T, P3 D- Z. @
- #define FLASH_TESTSIZE 512 //实际是512*2=1024字节% P# ^" S) |% r+ J
-
1 c* g( H4 w+ C3 a* m$ Z -
6 R/ ^5 r8 l! U% Q% W4 ^( C. D$ G - /* 扩展变量 ------------------------------------------------------------------*/( q& j( K6 x. y9 f; u- [
- /* 函数声明 ------------------------------------------------------------------*/ ~/ \7 Y' _) U4 M! b$ t8 m
- uint16_t STMFLASH_ReadHalfWord(uint32_t faddr); //读出半字% m U) E* E6 r- p5 E# j* d
-
1 k3 @: R( J7 Y: r, C5 | - void STMFLASH_WriteLenByte(uint32_t WriteAddr, uint32_t DataToWrite, uint16_t Len ); //指定地址开始写入指定长度的数据
2 I$ [: _9 J S6 x - uint32_t STMFLASH_ReadLenByte(uint32_t ReadAddr, uint16_t Len ); //指定地址开始读取指定长度数据7 w! z1 P; I. F/ W* L! M# I
- void STMFLASH_Write( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite ); //从指定地址开始写入指定长度的数据. }* N2 _- o, v2 h9 B- Y1 D* O o
- void STMFLASH_Read( uint32_t ReadAddr, uint16_t * pBuffer, uint16_t NumToRead ); //从指定地址开始读出指定长度的数据5 k2 T7 ]: f* k( t, c$ C
- //static TestStatus Buffercmp(uint16_t* pBuffer1, uint16_t* pBuffer2, uint16_t BufferLength);
! a0 r3 A( q0 l - TestStatus Buffercmp(uint16_t* pBuffer1, uint16_t* pBuffer2, uint16_t BufferLength);; t% q+ ^0 D+ s! z; e
- 9 A, [* @7 w. i% {
- #endif /* __STMFLASH_H__ */: N' O+ g9 \9 s# D! P& I n/ Q
- % Q: @) A4 i& P( Z# `
- /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码 $ }2 K, k. v6 C0 h4 b2 L5 H1 k
3.3 main.c
! k/ }+ _" R9 I" ]. q v- /* USER CODE BEGIN Header */
# }3 k$ m0 ?$ J: w - /**
9 `$ t5 T' f% f @* L- j% ~ - ******************************************************************************3 d/ ?. J1 M2 h' m$ Z
- * @file : main.c6 e* q) M) T# L2 L# q
- * @brief : Main program body
. @8 L& | D, D0 r$ x - ******************************************************************************6 H7 P8 j* z$ d; c7 T
- * @attention( p/ U- l, U' f; Y, K, |4 L/ L
- *8 o9 e( Z) M- L* z; O
- * <h2><center>© Copyright (c) 2019 STMicroelectronics.# }" U. y, T& r) s0 H; `7 X
- * All rights reserved.</center></h2>
3 x4 F( A1 Q1 s7 b - *
+ I, G+ p& B ]) ]) Z O9 e% K1 C - * This software component is licensed by ST under BSD 3-Clause license,- S0 i$ T0 _) ?8 C6 r7 [! A" p
- * the "License"; You may not use this file except in compliance with the
5 x% _; r" u: k( l9 B - * License. You may obtain a copy of the License at:
( N) a2 `$ q% W+ z0 I2 Y - * opensource.org/licenses/BSD-3-Clause
- A* [7 h6 @- l% Z0 t. P1 V - *
6 Z. @* m' h. F8 B - ******************************************************************************
+ F: r" r% z6 h0 c6 T - */
! o5 R( {- k `: q( B; { - /* USER CODE END Header */
" Q# F2 f! g% A6 K$ x" x8 G2 t - ' k7 Q0 B7 h3 k3 `$ G& G5 i
- /* Includes ------------------------------------------------------------------*/# Y6 A: k/ l5 v
- #include "main.h"2 O7 Q/ @* L3 h/ l! _4 G/ z0 w7 ]
- #include "can.h"
4 P. w/ W: e% d" H$ M/ V; A+ H$ t) Z - #include "dma.h"
. ]2 i) I! t7 F; @+ k - #include "lwip.h". |( W3 }! g2 O- z. |0 }
- #include "usart.h"' U. b# a. l" `
- #include "gpio.h" \/ e5 K/ P- p6 q0 Z
- 7 ?* b) I* d$ _& j u \( ^
- /* Private includes ----------------------------------------------------------*/
: ^, y4 I; X" S n, X - /* USER CODE BEGIN Includes */( K! E: w* k6 S0 l" N: }9 K2 k3 b' a
- #include "string.h"
& u* \: d& s- X3 H2 V" f8 _( C1 S - #include "tcp_echoclient.h"0 R9 k. L4 |" J l( q. o
-
8 j3 V. N. [) s( e) B1 A) N' L% j - /* USER CODE END Includes */
0 _. T" v5 ~. M5 i" p- D -
% n5 w9 v5 I! E5 i+ Q' p) H - /* Private typedef -----------------------------------------------------------*/4 L. ~6 ]( B" N/ I' x3 m
- /* USER CODE BEGIN PTD */) `+ O7 z8 V$ v# ]
- 5 J0 u3 M8 B3 \
- /* USER CODE END PTD */
2 b/ |; W y2 G. V8 ? -
* d) ~/ U) m& a! p2 a4 A d9 ?1 g - /* Private define ------------------------------------------------------------*/
' K9 P1 j$ f1 M - /* USER CODE BEGIN PD */. s8 f( e' R$ A; D0 {
- #define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))- Y2 b* \/ R( W: d F2 a( f
-
6 F- ?" Y1 ^# u) g$ P, r, j - /* USER CODE END PD */
' S& D% Z1 {8 _' j* [' L - $ s+ X' Y" D$ I
- /* Private macro -------------------------------------------------------------*// A, ~- T% l( {0 x) p& G0 _
- /* USER CODE BEGIN PM */1 V7 A' s/ c! T8 s
-
' p; }: G# o8 y: {8 o4 Q: z - /* USER CODE END PM */' W6 T7 O: c2 R. o. B; O+ z' s- R
- % w; A8 j2 Y9 v& e- V9 B& |3 C
- /* Private variables ---------------------------------------------------------*/
! a0 ]- u r" z -
6 U2 H' S! ~5 y! E" p6 A - /* USER CODE BEGIN PV */
- L- F `4 f& I* ?& F - uint32_t counter_10ms, counter_50ms, counter_100ms, counter_200ms, counter_500ms, counter_1000ms, counter_2000ms, counter_5000ms, counter_10s;
5 I1 q% H/ o4 d1 t2 r' r% i - uint8_t flag_1ms, flag_10ms, flag_50ms, flag_100ms, flag_200ms, flag_500ms, flag_1000ms, flag_2000ms, flag_5000ms, flag_10s;
/ w% k2 S' T% C3 H* Z) U) g0 y - uint8_t b_KeyNumber;
; O' ]; ~& U. y8 _7 v - " H0 d/ @9 r6 m9 J
- uint8_t a_DtuInBuffer[100];' U$ u) B3 N; ]5 T) O( y
- uint16_t b_DtuInBufferRxCnt;
6 ] I `/ w1 j* a# ?+ u - - U& A& v9 V. S3 J
- uint8_t a_DtuOutBuffer[100];, ~7 }6 j+ W# O& n# Z5 c( C
- uint16_t b_DtuOutBufferRxCnt;
r; F! m! E. |" ` -
; O) b4 c5 u" U3 O% [ - struct netif gnetif;6 Q; x5 Q4 u. O# j. i4 \ W
- extern struct tcp_pcb *echoclient_pcb;5 q1 y. @+ o0 K; |' d z' U, }( P
- uint32_t status_TCPProc;! v' C6 Q6 u$ ^- v- R
-
) ?4 `& o! o7 x5 { - " {$ V" J# [1 s4 c) ]8 R& x, y
- uint8_t a_SocketConfig[7];
6 `7 a: k2 M" N8 T4 d2 o - uint8_t a_SocketHeartBeat[60];$ {, z6 w, x$ L" s% e6 _
- uint8_t a_SocketHeartBeatInterval[2];
h% L- q2 I9 V( q - uint8_t a_SocketRegister[60];
" f- L5 z' h9 R# t) H, b+ L - / E& K* ^ _ H; R5 @7 _$ Z
- uint8_t a_DtuInOutConfig[2];2 q$ |+ Z" z* i% b9 F1 A5 F
-
- a# W$ x0 _4 }! F - uint8_t b_WifiMode;$ T- ?& o. N6 q
- uint8_t a_RouterSsid[20];; [% }) t" c( D3 P5 }; U
- uint8_t a_RouterPswd[20];8 I) T( @$ o( H/ K0 `# o7 t: @1 _0 S
-
8 w% b* L' ?1 p* W& I7 h8 @7 M' k - uint8_t a_Rs485Config[5];2 j" s% W' F8 X B) U2 B
- uint8_t a_CanConfig[5];# R$ o+ t0 d3 U; z9 K
- |" |$ M& H5 H" {" N# U w
- uint8_t flag_DtuConfigUpdate;
' o& s$ n/ W- Z) ] - uint8_t flag_DtuEthReady = 0;' `; h' m- K. ` V
- ) V. f, `) g8 m6 U
- uint32_t b_HeartBeatPackageCnt = 0;9 u8 G( {9 P$ S; D+ M
-
" P' e; c5 l ~8 \( d% J - uint32_t b_232STM32ParamConfigBusyCnt = 0; //尝试通过串口和STM32交互时候,会让出相应时间,优先处理8 g+ U( j1 n3 Q U' T. ]4 @
- 9 y! Q+ n w# t1 \
- /* USER CODE END PV */
- F3 N% N, g* B( W u$ S( } -
& ?9 L/ ~ |# n" O - /* Private function prototypes -----------------------------------------------*/
! V2 o' |: M4 T9 F7 h6 Z - void SystemClock_Config(void);- A f0 u! q& p& i* `0 I/ i
- /* USER CODE BEGIN PFP */& w7 n' o; V2 Q4 a2 r4 h
- 7 i9 k; G+ _- I' m
- /* USER CODE END PFP */4 J4 q, ^* L( S* u5 G
- 8 ?3 ~6 _: E% ]! T9 ]( L6 |
- /* Private user code ---------------------------------------------------------*/9 u* }) F8 ^3 Q; Y s) _: n
- /* USER CODE BEGIN 0 */
6 ~# L1 {4 t9 |) [3 y* ^6 n- ^: t5 _4 b - void Task_HeartBeatPackSent(void)
/ o6 L6 _3 ^3 B$ } - {
. X) T9 t' `5 @( d - uint16_t b_interval;
+ t+ E# x2 u# g% b- q- r -
F, l" J! k. E* u - b_interval = (a_SocketHeartBeatInterval[0]<<8) + a_SocketHeartBeatInterval[1];
# P: L7 b' ~* L" ^7 P/ o# J. P - 6 V5 A5 j: _$ s4 E
- b_HeartBeatPackageCnt++;
- J3 g# t$ W( e - if(b_HeartBeatPackageCnt>=b_interval)
1 ^6 r0 P/ c, X5 ?) z - {/ b) r, h5 v) j% I6 F* x
- b_HeartBeatPackageCnt = 0;7 _& O6 o/ B9 ?: b3 Q
-
r6 D8 O% r3 a6 p - 3 R( ?$ ^" P9 l
- if(a_DtuInOutConfig[1]==1)
- Y5 j- i" I, r9 V# T D+ o! A - {
( Z! Q8 P- Z4 ?6 }9 b/ y1 \" h3 s - if(flag_8266DTUReady==1)" d$ x: A# w! D' u
- {
& l% v/ _ P) \/ A+ H7 g. V b; X1 x* e - HAL_UART_Transmit(&huart3, a_SocketHeartBeat, strlen((char*)a_SocketHeartBeat), 100);0 \6 c) G; |9 w
- printf("\r\n");
' N2 k) `$ n6 s" M - printf("\r\nA heart beat package is sent.\r\n ");
; ?, h) [1 h( T% H" @" K; l* ~2 w4 i - }
3 e1 n2 l5 M) q% k8 k* d - }# e: L8 ^3 J" p8 l& N
- else if(a_DtuInOutConfig[1]==2): v. \" _+ ]5 D& E* B9 ~( ?$ L& D2 G
- {9 X6 D% |& s) O6 M! I9 X. M
- if(status_TCPProc>=2)5 C: j8 h& t" x. q, W9 Y. X8 E6 ^) E
- {
& R: i- {! d3 F4 Q/ }. C7 | - tcp_senddata(1);9 N) h' e1 ]3 [$ Z
- printf("\r\n");& g" p! j' g5 M' h: I, h, u9 V
- printf("\r\nA heart beat package is sent.\r\n ");1 v s& q2 E. e: o
- }
I, K: g" r( b# R: s: b6 G: r - }/ x: Z/ C6 J0 Y
- }, j: A H. ^% }1 ^4 o
- }, |1 n' T; t7 L; S( I; d
- void cleanDtuInBuffer(void)
* @- k S; |- @% K. l2 o - {
0 V) p: s7 u$ E5 W* g M' p+ R - uint32_t i;
1 d. z) }! }& b - for(i=0;i<b_DtuInBufferRxCnt;i++)
4 I" T& B9 P7 M8 Z* y* W1 d - {
4 P2 K$ t, `6 ^$ U- W+ ~ - a_DtuInBuffer[i] = 0;6 F, e7 A3 b& C# _ i
- }+ |% \7 m: x/ h, \) h2 x
- b_DtuInBufferRxCnt = 0;
3 g- n* G; p6 Q- y& _/ y5 Y( N# c/ @ - }, l" ]# r. C2 m
- void cleanDtuOutBuffer(void)% i( r1 W* d' w8 @! y
- {
5 H* @' X( X5 v: T' \0 b- | - uint32_t i;9 Z0 m2 m- D& m- f6 C' Y! [
- for(i=0;i<b_DtuOutBufferRxCnt;i++)
0 J5 Q% b" K2 y- R2 V: L3 N - {
9 F, h5 o9 q i; s A - a_DtuOutBuffer[i] = 0;$ A g/ N4 J, s6 }0 @2 k n3 H
- }
) B9 s: q7 H9 q: u$ {9 W - b_DtuOutBufferRxCnt = 0;" S4 o8 M9 W9 d, W; j9 [
- }
# A' p5 e) L# G& { -
: b; x3 X* H% [8 R - void Task_DirectTransfer(void)
* g9 _" x; U# L9 h; J4 S, @; n - {
" j0 @7 K# m- ]7 n- G6 X5 @ - uint32_t i, k;- D" @8 {; b$ b* Q+ S, x4 v t
- //把数据输出到以太网或者WIFI
! D. `# \3 h3 L - if(a_DtuInOutConfig[1]==1)+ C/ u& p: a1 g9 q
- {+ x D# A" W+ v7 t2 y. f9 Y: Y W
- if(flag_8266DTUReady==1)' |- U4 G: {0 E. ~ J$ s: r; R
- {
# H* O+ [! R) O, i& W8 ]" f. _ - if(b_DtuInBufferRxCnt>0)7 K( Q4 G9 Q6 o+ U- x
- {
# {8 C( Q2 ~% y. ~& V x- S - printf("\r\n");- o; m) U$ \& G# A% o
- printf("\r\nData sent to Wifi: ");
5 o" t! I3 H; u - HAL_UART_Transmit(&huart3, (uint8_t*)a_DtuInBuffer, b_DtuInBufferRxCnt, 100);
; w; q7 p/ g7 C; V2 U7 L4 l* r$ ` - HAL_UART_Transmit(&huart1, (uint8_t*)a_DtuInBuffer, b_DtuInBufferRxCnt, 100); //debug4 w6 ]' S$ [6 R- I
- cleanDtuInBuffer();
$ A6 e7 ?; x! h; G, O - }( g2 A6 ~: U0 C
- }5 q) g4 X4 V7 G. i* k% {6 f
- }
9 a" n" y. o; p' i$ K+ N - else if(a_DtuInOutConfig[1]==2)! [, Q% i; G& ?
- {
! x7 ~8 f: e3 r2 b' ` - if(status_TCPProc>=2)+ T& S4 I. a; R. k, O; U$ l% `6 p) c
- {
' X$ `. g+ {5 g1 j' f8 e! y - if(status_TCPProc == 2)
3 ]& s6 S9 |! S. W* ~4 Z5 a3 K - {( @" ] K$ @& A/ }: }
- tcp_senddata(0); //专门发送注册包" U8 F- H6 k7 {- c% H" N, h
- }
' s$ C* }4 w1 o! _3 b - if(b_DtuInBufferRxCnt>0)
1 x# }5 V" ^; l0 m1 C1 b0 a& b - {+ P( n" a* Z) U. D- ^
- if(status_TCPProc <= 3)
6 }) R: E8 A% Y+ g# u. W - {) T3 X- ~, F5 |$ Y: g
- tcp_senddata(0);
& }9 [% E. @8 n9 X - }
* [/ g8 o. l. R. p2 M1 j+ Z5 g - else$ ]2 a3 m2 l5 H( g
- {; u# y1 B- f# ~" d6 i/ b8 G5 L
- status_TCPProc = 0;
& I7 E, h; |7 A: q0 U. W - }: p6 D% {; {# c2 q2 e" s' _
- cleanDtuInBuffer();) e% y- n( C u& j. `% {0 Q; p
- }
, a2 ?0 ?, T8 E' m z - }" z- m/ P) w7 M7 P9 C8 [/ _$ i) Z6 T
- }3 l- M2 g4 [; G* m/ W; a; b- P
-
' P) M. F! M$ e0 R8 C9 s5 O& p -
4 v7 l( n% _! r c6 I3 R - //把数据输出到RS232,RS485或者CAN
# p4 `# d, ~3 z8 i - if(a_DtuInOutConfig[0]==1)
9 w, Q# e1 Z' v8 A- O+ [% D( U - {
8 i9 q! Y: k: l6 e3 U - if(b_DtuOutBufferRxCnt>0)
3 g. a- N2 r e. I9 ?5 Q# {' p* r0 K - {
' E6 L5 L+ l ^6 m, ] - HAL_UART_Transmit(&huart1, (uint8_t*)a_DtuOutBuffer, b_DtuOutBufferRxCnt, 100);+ S% o- \, N7 P( H2 b/ O
- cleanDtuOutBuffer();
" L+ H/ l2 V2 U+ v% m |8 H, B6 x - }
7 n [: @; V* c: g - }4 a5 T; H$ D6 Z$ k' a" d
- else if(a_DtuInOutConfig[0]==2)
- h. ~# N; m* J' U - {
/ i+ M# [2 X, |% ^ - if(b_DtuOutBufferRxCnt>0)
- z- N" J( G& O# p/ ^8 `- w$ B: q - {4 _: k) }: M& |! X) f: Q7 Y0 I* C: T
- printf("\r\n");
; l1 `- A5 j" t( w8 a* z0 q- ]* J$ C - printf("\r\nData sent to RS485: ");
* `2 b" T, ~& Z) I! G; R - HAL_UART_Transmit(&huart1, (uint8_t*)a_DtuOutBuffer, b_DtuOutBufferRxCnt, 100);//debug# ~; y: }8 I0 ^. U( R3 C
- RS485_TX_MODE();$ `3 }* G6 f$ S- ^
- HAL_UART_Transmit(&huart5, (uint8_t*)a_DtuOutBuffer, b_DtuOutBufferRxCnt, 100);
( [! c% o: C' ?3 o z4 X - HAL_Delay(1);* M0 C3 H. w- A/ X
- RS485_RX_MODE();5 P4 A+ a8 H1 x# Y& O4 G
- cleanDtuOutBuffer();. Q" G4 ?6 J1 w9 c# D1 n
- }
9 Q8 x# |5 i! V3 H& G) ^! U - }/ d, U8 N+ O% j0 T" m& [
- else if(a_DtuInOutConfig[0]==3)
7 G g1 t( `, x2 q8 V' \0 Y3 n - {& s7 n* z# D6 V" B5 }: k4 D! o& ?
- if(b_DtuOutBufferRxCnt>0)! g( ^( _: A0 j/ |1 I p
- {
# K7 M. {# D2 O7 ^; A0 z1 v9 P - k = 0;
& s, Q, }3 _, _5 {- x - if(b_DtuOutBufferRxCnt>8)
2 L y. D5 _- a" Y - {
& P+ ?! K9 K6 E3 F- \ - for(i=0; i<8; i++)
" u* h# v7 V8 g% F - {7 c& S" D" F" Q1 V: A' ]* P
- Can_TxData[i] = a_DtuOutBuffer[i];
( O7 _0 D' X, f" G- x1 Y; j - k += Can_TxData[i];
% I' I- u1 `1 E - }3 m) v) l' S0 w3 U% h# V* T# s, r/ o
- }
7 G, P* ?6 y8 v9 g9 g - else, t0 E- b! ^" ]% b
- {
; O+ V: m" o: q# x; r7 m - for(i=0; i<b_DtuOutBufferRxCnt; i++)
- ?8 d, A9 Q! [3 J6 M - {
. u+ T( l: G' T& p- F; `" } - Can_TxData[i] = a_DtuOutBuffer[i];
- k. ~0 T. W6 R8 c, v - k += Can_TxData[i];) Y7 G9 b5 R+ C: }2 @7 t
- }
& R0 S8 O5 ^" C# z: D2 h5 L+ N2 M - }+ y* x8 S. s: N
- if(k>0)! R) `7 a2 t7 f8 i7 W! f! D8 c3 v
- {
' L7 a' y2 E A7 k3 e: o0 M9 e - if(b_DtuOutBufferRxCnt>8)
2 z% w1 g6 F* l. S) P/ N4 Y - {
8 Y- L) Q/ \1 V5 O - Can_TxMessage(0, Can_TxHeader.StdId, 8, Can_TxData);
( r: Y/ d" o% f - }0 Q" Q# y) J1 n
- else
0 _5 N, X/ J5 o4 A+ l6 j8 _ - {* ]# S7 }! @9 `- `" v- u; P1 k& H
- Can_TxMessage(0, Can_TxHeader.StdId, b_DtuOutBufferRxCnt, Can_TxData);; _: R+ }9 y8 ? I
- }
# W5 |; p+ Y9 Z - ArrayLeftShift8bits(a_DtuOutBuffer, &b_DtuOutBufferRxCnt);7 J0 r. |* s( D. W% m6 g
- }& Z" i) k1 I7 i0 f9 z4 k& S8 D
- else0 }" x2 B) L4 k' F, {. [
- {7 Z& Q2 o; f: u! D3 j2 Z) ^
- b_DtuOutBufferRxCnt = 0;
+ Y: \3 v* Q6 m! {! @ - }
/ H4 V$ P( v9 q( }$ } - }
! g$ f0 `& w X! q1 S5 e( d - }" g( U7 t d9 p/ _/ J) u, e: h+ X
- }6 X" A: c3 A% u1 l" s" v8 G4 h3 W
- void Task_DtuRedoConfig(void)
0 c" `; e9 l1 ]1 w% R! o" f - {
- T: ?7 i$ j e9 N1 M6 h - if(flag_DtuConfigUpdate==0)
. ^' ]# [/ w" @+ o- S$ J* Y - return;
4 c6 j+ ^* ]. g, x! R! H2 _ -
4 o0 }" U6 U! Y - HAL_Delay(10);
# A# S4 l6 B- N& I - printf("Re-initialize ETH, WIFI module, RS485... ");
- s; W. q' B$ J& y1 W$ M - //ETH:! d9 |/ ]3 D& n6 U
- if(status_TCPProc >= 2)1 u! o- E* P6 u. o9 ~ p, Z
- {- m2 Z; P0 e# ?6 D! f
- tcp_echoclient_disconnect();
7 t7 X" Z8 ]* ]: H% K# g - status_TCPProc = 0;9 S" ^4 }$ c4 r9 d D
- }
' F* p/ m* i8 i, X - //ESP8266:
" M0 x1 c) v; ]+ H/ }. `4 y8 K - if(Status_NodeMCU>=6)+ k' m3 R/ z! w( B
- {, ~% o; a: L0 w3 s7 t
- sprintf((char *)a_8266TxBuffer, "+++"); //esp8266 接收到这个+++会停止透传模式
7 g5 E$ _' z1 Z: ?. G/ o3 { - HAL_UART_Transmit(&huart3, (uint8_t *)a_8266TxBuffer, strlen((char *)a_8266TxBuffer), 100);
. J2 f( _2 t$ {5 C - Status_NodeMCU = 0;' x( v$ e1 `$ ~4 [ b1 u
- HAL_Delay(100);
% \$ W1 v" C( x' | - }* b3 L' ^: Z) c4 N- P
- //485
5 w( L$ K+ n2 P [. J: m& w: @* ? - //MX_RS485_Reconfigure();
3 ~ _+ ]) O$ z - printf("Completed.\r\n");
& f8 T: D7 s* R3 F6 z - //3 c1 f+ s9 u' ]. t4 t
- flag_DtuConfigUpdate = 0; D X" @: F2 A) i. Q
-
3 c* w [) o2 y; i4 ^ - HAL_UART_Receive_IT(&huart1, &b_232RxByte, 1);/ P, N9 D/ |& t* Q2 R
- }
7 l3 y1 G) K; T - /* USER CODE END 0 */: x; ~9 K) N7 r+ L. y6 K! |
- f! J+ f& Q. U: F) \
- /**' }, J/ F. D+ g) k
- * @brief The application entry point.0 g# C! W7 J+ J. n/ g- m
- * @retval int
" F' [% n+ _( X - */8 K4 [0 m3 `1 M; C( A+ Q x3 _* Y A
- int main(void)9 ?2 K3 s* N7 ]/ M' O( `. k3 T
- {
- F; M$ r& a$ ^0 a2 Q. h+ J - /* USER CODE BEGIN 1 */9 |4 F. g' i- W$ C' A3 _
-
* J4 Q% l4 v7 D' n - /* USER CODE END 1 */
: C. n- ^( O) s0 I1 a3 G2 I8 S, g - 8 ?$ y( m: x9 u! w' [% F+ r
-
- J1 v6 ]6 W* S8 f4 R% A - /* MCU Configuration--------------------------------------------------------*/! U8 I0 _, w+ B( v2 C8 L7 m
-
1 r/ T! V; B( D5 q. p - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */% g0 t# M8 F7 s$ Y# T
- HAL_Init();% y6 M# q( D' ^) X& f
-
6 _- O, l" B. L( o - /* USER CODE BEGIN Init */. i5 I1 A. o( i0 @9 u
-
7 {* m8 ^/ |& \+ Y5 U, a: X - /* USER CODE END Init */$ T o0 O8 n7 c! \9 Y: D6 s
- 7 e0 k; {1 S, N
- /* Configure the system clock */
1 C; E# R/ U3 K6 r4 @1 d& P' `, T - SystemClock_Config();
( ]7 J1 j/ W' M. e# { -
+ Y7 ^; O2 b1 m! ?+ B - /* USER CODE BEGIN SysInit */, R# O' t! I- ]2 Y
- . U# f0 r. r0 }. A, e; I* E
- /* USER CODE END SysInit */, d& Z4 ^8 V+ ~1 f `
-
3 J t: s4 }2 w+ ~- Q: j+ V5 P - /* Initialize all configured peripherals */8 C0 S- H9 X& |! y/ o2 T" z
- MX_GPIO_Init();& C/ U. e. S- s6 {! q" `6 d
- MX_DMA_Init();
, {0 L4 C) N( ^; _6 d: ]9 } - MX_USART1_UART_Init();
. C; q* }7 L, T- l - MX_USART3_UART_Init();; d. e J- F7 q3 u( v) M
- MX_CAN1_Init();
6 i9 }# `/ x# D/ j. H( p* M - MX_UART5_Init();( H; ?1 N- g4 a8 I# j3 b6 @" e
- MX_LWIP_Init();
@8 v1 T8 r5 K( l - /* USER CODE BEGIN 2 */
V7 V* Q9 ]! g5 S& H& }0 S0 V -
2 u' _2 E& R2 @ - RS232Interact_Init();
1 Y$ {$ ]( |( Z - printf("Hello. STM32F107_DTU project: DTU. All in one.\n");0 V9 ]2 h. S, S2 h) F5 r
- 8 p/ o( b/ l: \1 w8 d0 w$ u
- HAL_UART_Receive_IT(&huart1, &b_232RxByte, 1);
2 u- P; a1 z* o7 J+ e1 h - HAL_UART_Receive_IT(&huart5, &b_485RxByte, 1);
% Q& o9 c1 F( Z0 S2 e/ V5 n - + P0 }+ t j0 M) l' a, [
-
% N+ n/ Y5 O5 @8 K- `2 `' k" \ - sprintf((char *)a_8266TxBuffer, "+++"); //esp8266 接收到这个+++会停止透传模式
- F7 x v2 {. H, X* v; H - HAL_UART_Transmit(&huart3, (uint8_t *)a_8266TxBuffer, strlen((char *)a_8266TxBuffer), 100);6 [1 s- p5 f: K
- Status_NodeMCU = 0;
~7 N/ r0 m# r. Y, O" U -
8 Q5 j- x" o; u, @% G: N5 J1 l - status_TCPProc = 0;
) h9 C# D8 y. o$ V# Z0 _ - 0 N$ _& E! d* ^1 o+ W* S
- RS485_RX_MODE();
% }6 c4 M* `( q( F6 u$ _* A! E -
' }* W r2 \$ K$ [ - CAN_Config_User();
9 b) p7 o J) z! r -
( X& u, o' t. @$ V- O' J" V -
5 G& [ R4 `/ h2 w/ d* A - /* USER CODE END 2 */$ w' ~( L/ h! L
- % q0 ~4 B5 V/ [' u- l# N l
- /* Infinite loop */2 y- I2 X( F$ ~7 |4 O8 s# h
- /* USER CODE BEGIN WHILE */
, \, a2 [- K* l$ @ y8 ` - while (1)0 o' k! g0 @: h! {$ t U- a
- {
0 V! ?" _1 o' a& E - if(a_DtuInOutConfig[1]==2)
3 ?. M3 X6 z9 i2 z. _3 G) Z0 @1 V4 } - {
* M* v& r% m) i5 A( o! o- e# k - MX_LWIP_Process();, I4 e4 |% w& f; K
- }
% M& e/ \, T+ s2 \9 x$ Q6 k: S - if(flag_1ms ==1)
" Q$ _7 V2 ]! {) p; F4 n5 w% \1 B4 ] - {# E1 r8 h. c6 ^, V* H/ i5 m8 _
- flag_1ms = 0;6 N2 i: v- P/ w- N
- Task_232PC_Interact();( B' S! b3 c& W# L0 I: }
- 2 q/ b3 [& y7 J% u- @. O. f
- if(flag_DtuConfigUpdate ==1)
" n; `6 {2 X. n u! L; x8 U - {
. h8 m6 e9 u0 J" T* t- A - Task_DtuRedoConfig();8 X- T# e m. {- {" w( l, G
- }# M9 R# g: `1 |9 n) g0 @
- if(b_232STM32ParamConfigBusyCnt>6), \7 o( ~% A/ ]7 ]0 w" k4 w
- {$ H: a/ O( u8 C1 g! A' k4 C `5 Z
- Task_DirectTransfer();
* D! h# X2 \( D) X# ^% R9 i9 n - }
, g7 h& F! l& M' o6 z, z - }
& S {$ R5 ^5 b7 x) c0 v' w% A - if(flag_10ms==1)
L9 [) G0 M% x6 e - {
# Z% B8 q) d9 N% a6 f8 r3 \( d - flag_10ms=0;- f0 a5 t0 o/ C3 {4 S3 y
-
- J4 X' ^8 t2 C - }: u) M) K( l+ o# B) v
- if(flag_50ms==1) { flag_50ms=0; }' a6 e8 O. Y* o M9 B9 ?
- if(flag_100ms==1)
9 G, w4 R: L! } - {
* E2 e5 A, e9 n5 g: A - if(b_232STM32ParamConfigBusyCnt>6)
0 ^) M8 G1 `% }* b4 V - {
% E3 `" I1 T6 X- x2 P# M - if(a_DtuInOutConfig[1]==1)
% B/ \2 b* y% ^8 e7 @ U% V& W; d - {5 V, S7 a7 s( \6 e/ W2 f0 g8 R
- if((flag_ProcNodeMCUActive ==1)&&(status_232PC<12))
9 z" t+ y+ T8 I - {* W3 \3 ?0 U/ Z. N
- Proc_NodeMCU();+ a: f' _8 J! Y6 Z( D- V) l
- }
; x1 ~0 @ y: D/ O% d/ o - }; K. h5 W( }+ v$ C/ P
- }; k& _3 B4 P% e6 @+ E+ e2 v6 ^& Y4 L
- flag_100ms=0;/ c, M' S& c+ p3 ~
- }
1 ]( o( O% T$ I) Y+ ^1 t$ I - if(flag_200ms==1) { flag_200ms=0; }
+ @- U* g6 b5 o# P6 w - if(flag_500ms==1) { flag_500ms=0; }0 K* [5 e5 u/ {. ]: V- b$ J# n
- if(flag_1000ms==1)
" \( [* n9 ~7 u9 I5 n* p. Z - {/ U$ Y) a4 A1 F8 I! c% b P
- flag_1000ms=0;
% r. v: C& p% N2 M! X - HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
4 b. S# o: |3 e( ~$ g f& i - B9 y$ u/ R }. E0 p) b
- if(b_232STM32ParamConfigBusyCnt>6)
. P2 k; K2 z. \+ J" ~6 n8 N; T - {
; u5 Z/ k4 R u' B - if(a_DtuInOutConfig[1]==2)
# l ~& J9 d. u) X% H6 D - {
( _) \; E7 m; G' ^- { - if(status_TCPProc<=1)- z. @1 t( W* q N# B( _
- {
7 Z. u* Y) {. ?' y6 D. H - printf("connecting to TCP Server...\r\n");
0 p! _; G! X6 o) D/ x. N! a - tcp_echoclient_connect();
# O# m2 P& }7 ~4 Q - }
% K7 j- E, ?/ J. ?% x1 F' R4 z' R* J - }1 h6 q( H# [$ h& ~! E5 }
- Task_HeartBeatPackSent();
; Q- e+ r& ?5 S v - }
( X% ]: X& Z" B+ u( u - if(flag_ProcNodeMCUActive ==0)
# j5 }& n* ]& a/ b% x - {1 s% c, q: W& {* O7 |4 I, L+ S
- flag_ProcNodeMCUActive = 1;
. e5 F4 `( U0 q5 W3 ^% o; R- e: ~ - }, Y4 P7 p, U" J1 V
- if(b_232STM32ParamConfigBusyCnt<80)6 J g/ }: @; ^4 k! I# Y% [
- {3 z3 o* T' D0 J" C1 Y
- b_232STM32ParamConfigBusyCnt++;
9 E% P7 f& w6 C3 ?: ^ - }
3 N" k# X! n* d. R, G" N - }
, i3 z: M0 c9 k: [ - if(flag_2000ms==1)
0 l7 z: u- C# C9 J7 s - {0 ]7 o- k) A. m a: p- W6 Q
- flag_2000ms=0;! C* R9 k4 |. Y |' v T0 l
- . ^5 d, ?% @1 @# N
- } }& R8 j8 ?+ R- @% k+ [" Y
- if(flag_5000ms==1)
7 l+ o3 U+ }+ F$ `; X - {7 z8 n, l3 C* G
- flag_5000ms=0;% [* W' S q- c( W: a: k7 ^% i
- }
" T2 \$ V6 `. A9 N/ W -
6 P; S! R5 {0 F' F) \. P - if(flag_10s==1)$ |* }" S1 Q- K+ B
- {2 b, ~7 i. A" H& t& O) s! ?. g
- flag_10s=0;. `( s3 ^$ i9 T5 ^9 \. K8 V
- }3 U: F/ C* G2 n- c- C
- /* USER CODE END WHILE */
' V# ^4 U C0 v& R -
2 h) D( f4 h4 A) L. M - /* USER CODE BEGIN 3 */
1 L! s3 S- ~6 k, |; w# t - }% E' _+ Q7 t5 } Z m8 L5 M% [
- /* USER CODE END 3 */ \( h& p Z* k; x9 Z
- }
' @# C% c+ a/ L% m9 P - ( G0 m$ Y J% c, m
- /**
' R. k- N) U, E/ H8 d/ i/ C) D - * @brief System Clock Configuration4 ^6 Q# |/ N& E, ~4 A% T
- * @retval None" E, ]8 `1 m; E, d1 C: C; [4 i
- */$ |( K9 w2 O# W& u
- void SystemClock_Config(void)
5 t; u& ], v2 ^3 n8 N" y - {( {, j- j2 R" v' Z1 Z
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};4 ]1 y/ T/ h$ ?6 G' ~
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};1 A; \ B7 `$ ]3 g! {' d
- . i+ Z1 A/ a p X0 b( F
- /** Initializes the CPU, AHB and APB busses clocks 5 ]1 Z9 Y' ?1 ^7 B
- */8 f7 `" T6 N7 q4 w1 ?
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
, w$ h3 T* ~% ^8 s: L$ d - RCC_OscInitStruct.HSEState = RCC_HSE_ON;
1 L& W0 g2 a' i. f. H; v& n) V - RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV5;' ?, g7 C& }: b3 W3 Z- U8 r
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;0 a9 E1 c5 d, H1 N! n
- RCC_OscInitStruct.Prediv1Source = RCC_PREDIV1_SOURCE_PLL2;: u p8 P8 b. x5 g
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;8 M5 h- y9 ~8 v$ J/ w J8 ~+ k
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
( W7 j! A, C- g3 } - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
' J3 k3 I+ K+ M6 w2 J* ]* [ - RCC_OscInitStruct.PLL2.PLL2State = RCC_PLL2_ON;2 D# E1 O7 n: n
- RCC_OscInitStruct.PLL2.PLL2MUL = RCC_PLL2_MUL10;
* \9 z- y, s- }. |% p( |; G - RCC_OscInitStruct.PLL2.HSEPrediv2Value = RCC_HSE_PREDIV2_DIV2;& O E1 @0 W: V* L' U
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)4 c# a3 [# n( E) {
- {, o' p6 v: R" U3 l; b
- Error_Handler();
4 H+ y" b7 R: [0 D0 K) B v7 C - }
! o0 F7 e* c2 j: G4 _& w - /** Initializes the CPU, AHB and APB busses clocks 5 e4 g; g' c" E
- */& @3 D: b5 B$ I- U( V4 g
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK6 `. y4 L% i, S: T. d; i5 ~) B& ^$ K
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- ~$ w% H9 D: [. k - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
# r; W; e* ^; C8 F - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
' L! G) m+ h& y* o6 h/ t4 D - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;& |9 G/ u+ T4 V N6 U
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
& V" S+ C6 t# u' v. V' @1 G -
3 W6 r* r# S2 H# s4 U - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
3 r. {8 m, a0 A6 C- c" D: f" s: P: s - {
: a; m) b0 A, I - Error_Handler();
& w: L, ^! x5 o+ [$ Q - }7 C+ D% X% v5 W8 [1 d. Q' f' a
- /** Enables the Clock Security System
! C9 ~ u7 c0 n - */8 {- v/ Z: I4 y+ F4 [4 d) ?
- HAL_RCC_EnableCSS();
! y# U' V+ i+ i! ~- a2 t - /** Configure the Systick interrupt time
; c5 F4 l1 E: U - */
* u" B; c' y Z2 N - __HAL_RCC_PLLI2S_ENABLE();$ |$ A% L$ z- I: ]* ]
- }1 K# ]: v( P, b! \+ j8 m7 X. e
-
' y; K f( D) T6 _0 [ - /* USER CODE BEGIN 4 */
3 w: ^' r* [+ A8 \$ D - + g4 T1 P( L Z; }1 d- d
- /**( x; U l) K2 o! F7 d! h/ T6 y
- * @brief HAL_SYSTICK_Callback()
0 L4 A; q( v! R, u* d/ X, ~- } - * SW timer triggered every 1ms.+ Q) ~. j9 U, {' Q' p$ h
- */# c# O1 g3 u# Z" ?' F
- void HAL_SYSTICK_Callback(void)
8 F5 o* w4 i* G+ A6 D: H - {
3 V/ }+ l- A, J6 ?/ O - flag_1ms = 1;# O. c/ t" a6 s( W' N) ?
- /*update counters*/
, _. d4 Z6 m) [0 h. } - if(counter_10ms<9) { counter_10ms++; }, l7 M( Z5 x6 ^4 N1 K9 O
- else { counter_10ms = 0; flag_10ms = 1; }% x5 m5 Q2 m) I
- if(counter_50ms<49) { counter_50ms++; }
' v2 \2 @4 ]; s: Z - else { counter_50ms = 0; flag_50ms = 1; }
! O# m! L5 f) U4 G% u2 O0 ]4 ?* }: d -
, d0 _4 x4 o6 r( E, X. f - if(counter_100ms<99) { counter_100ms++; }0 I% I! o/ D V$ M
- else { counter_100ms = 0; flag_100ms = 1;
+ y/ m I) _: T0 N* L - if(counter_200ms<1) { counter_200ms++; }5 C1 s! G) G5 B. O U9 y& Y) [1 q
- else { counter_200ms = 0; flag_200ms = 1; }+ O( [6 N8 T; a7 r' n2 s5 a
- if(counter_500ms<4) { counter_500ms++; }% \4 c& O) A$ x9 Q4 w) [
- else { counter_500ms = 0; flag_500ms = 1; }
/ o/ X$ b8 @; A9 E6 }5 O9 H9 S - if(counter_1000ms<9) { counter_1000ms++; }8 u9 h& }6 z; G
- else { counter_1000ms = 0; flag_1000ms = 1; }! g) @. Y3 c- C- e2 ^4 I
- if(counter_2000ms<19) { counter_2000ms++; }
$ W# O: T# \) X: N! f1 @7 G - else { counter_2000ms = 0; flag_2000ms = 1; }" N' ^; Y9 O0 B/ Z
- if(counter_5000ms<49) { counter_5000ms++; }
- g$ P2 V% U% x9 C- y$ h1 g: t - else { counter_5000ms = 0; flag_5000ms = 1; }
; Y7 ~. x8 A5 N7 x! U3 q& A - if(counter_10s<99) { counter_10s++; }
7 W0 [7 B* Q3 `! y/ `6 j( j. J - else { counter_10s = 0; flag_10s = 1; }% I# D8 F+ ~1 M. _
- }" h- P2 r" \2 R R( Y3 Y
- }
6 W7 j+ n( Q( u4 p7 j -
/ V" j- Q5 H8 x; t4 G) b& K - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)0 X5 j) H# t) X) |( l
- {, p( s" l3 \4 ~$ y( s% Y- ?5 {
- if(GPIO_Pin ==GPIO_PIN_13)5 J. L0 z4 x/ }, d4 p, w+ x' ^- [
- {
: Z" w* m4 i" ?5 { - b_KeyNumber++;
* P0 F3 B) r* o) m - if(b_KeyNumber>=2)4 W5 G$ P9 j+ k! N: l0 z
- {; `- q2 V$ S- f% Y) y
- b_KeyNumber = 0;- E. E; q7 [: V9 O9 g
- }$ k1 M& i9 A. M7 h3 r2 @
-
8 q$ \% ?& @ P6 u1 Z - sprintf((char *)a_DtuInBuffer, "a simple package\r\n");% I7 }4 I/ M" r) r- ?+ w. c" h5 D6 e& I
- b_DtuInBufferRxCnt = strlen((char *)a_DtuInBuffer);
3 F. k6 u& G+ p, Y6 z& F -
. s$ }- [0 R# a7 p, G% b - }
/ T, t z5 Q' ? J- L) L - }
: s+ n- M7 B' _ -
/ I, Z3 d% A( j( S4 V7 `2 T - /* USER CODE END 4 */
. L: R1 t) Z: x$ ~1 ~ -
0 H4 k3 ^3 Y& o; _ - /**
/ `' n" h' s3 j# W1 B8 T% Z - * @brief This function is executed in case of error occurrence.
% |" X' R& ^' ^ - * @retval None- B0 ^6 c' j0 L' i
- */
1 I- a, k8 F- D& g+ K u - void Error_Handler(void)
; `. E, I, A% Z9 R$ y/ y: `( ^7 [* j - {2 [3 O) n( A( e0 |2 U6 ~* E
- /* USER CODE BEGIN Error_Handler_Debug */
* b6 v) ^( n- ^ - /* User can add his own implementation to report the HAL error return state */
+ R* \6 V- P! h$ R0 M -
4 ?, G+ R" P% v- p, y7 } - /* USER CODE END Error_Handler_Debug */
, S2 ]; `2 P% B5 D& ~ }( o - }
1 M# i7 L: r6 x9 N$ I5 v -
; T, K# i' T* f, O0 e* b8 I - #ifdef USE_FULL_ASSERT
& R8 l+ H8 M4 o0 Z- h7 g+ E - /**! E2 y$ {# `1 x0 Q ]) Q: W
- * @brief Reports the name of the source file and the source line number P+ o" E2 C+ d/ D3 V
- * where the assert_param error has occurred.3 b- s; I d0 j* }, ?
- * @param file: pointer to the source file name
6 \# [! y9 i: a% ?" w9 b6 Y- v - * @param line: assert_param error line source number# b8 J% F9 U1 d4 \+ g
- * @retval None4 W6 D6 D& I" _) g$ Q* X {$ q @$ |
- */
: U6 a2 a4 t$ ~/ R0 v3 R# A - void assert_failed(uint8_t *file, uint32_t line)
2 [+ Y; Z0 _' o4 S, F - { + S. o* l" V8 U/ Z+ _
- /* USER CODE BEGIN 6 */0 @) @, {9 x# h: g( e6 {
- /* User can add his own implementation to report the file name and line number,& @% _; U% B1 H- \1 |
- tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */) U- z$ R0 a, L" u8 U
- /* USER CODE END 6 */
. i7 R2 |- B, ~4 U4 m( ] - }
+ u$ a* ]8 l7 E/ K- H( C8 W - #endif /* USE_FULL_ASSERT */' P c) X" H9 S' U2 j" s# @
- 7 G# K" Q6 _) l3 J9 m
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码
" U" P4 j" x; T4 i2 q4 试验结果开发板上面的指示灯亮了,同时使用仿真器观察接收数组的内容: 
7 Q& Z& O5 b3 \, t, D. ~% E7 o3 L; g: m) {% z4 [" h- d
|