你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

直接寄存器操作实现统一串口初始化(在PZ-6806L验证通过)

[复制链接]
aiherong 发布时间:2018-12-3 11:19
//-------------------------- AHR_USART.C --------------------------------------------------------------9 {! e" ?+ T) x6 R
#include "AHR_USART.H"% o) z& t/ k  _6 B4 r. I
u8  COMBUF[256]="0";    //接收缓冲,最大256个字节' ]% W5 J4 a+ ~7 X2 w; i$ A
u8  iComBuf=0;) Y, O  r. S4 n
u8  ComNow =2;          // 为区分5个串口共用一个缓冲区的识别问题而作的标记,显示时用颜色区分2 J6 |7 V1 ^- O: _' j: p) i' v: Y
//=====================================================================================================
% D" L7 p+ S# T: }# j  H// 直接寄存器操作实现全部串口通信初始化及数据收发:如:US123ART45Init(3,9600,0x0C,2,0,0,0,0);串3优先级27 G0 G8 D: {) ~( `
//      TX-串口输出: 1-A9 ;2-A2;3-B10;4-C10;5-C12  //char str[]="4Step:1.RCC;2.AFIO;3.USART;4.NVIC";
. |! Z; z/ o& ~5 Y( d//      RX-串口输入: 1-A10;2-A3;3-B11;4-C11;5-D2            未完成:NVIC 仍然使用库函数  -- 20180728 --
1 y* l) T3 V- ^1 _+ a1 Z//-----------------------------------------------------------------------------------------------------
; X8 e6 E/ Z" M, y const u32 irqNOADcom[5]={37/*0xD4:COM1*/,38/*0xD8:COM2*/,39/*0xDC:3*/,52/*0x110:4*/,53/*0x114:5*/};/ i6 Q( A& a; e+ P% R$ c- w
const u32 APB2IO_APB1US23ART45[10]={0x4004,0,0x04,0x20000,0x08,0x40000,0x10,0x80000,0x30,0x100000};
  O  P9 W2 i1 q! a. d( {; G const u32 USART_REGADDR[5]={0x40013800,0x40004400,0x40004800,0x40004C00,0x40005000};
0 |* i: B* X7 b: K: c const u32 COMxBaudRate[4]={0xEA6/*9600*/,0x271/*57600*/,0x138/*115200*/,0x08C/*256000*/};
- @( o+ }- R  Y; s% y const u32 TXRX_PortSet[5][6]={{0x40010804,0x000000B0,0xFFFFFFBF,0x40010804,0x00000400,0xFFFFF4FF},# P0 I. z* a6 d) N
                               {0x40010800,0x00000B00,0xFFFFFBFF,0x40010800,0x00004000,0xFFFF4FFF},
$ H% a+ |! _- ^                               {0x40010C04,0x00000B00,0xFFFFFBFF,0x40010C04,0x00004000,0xFFFF4FFF},
' |0 L4 _8 H, ^- c8 `4 C4 ^                               {0x40011004,0x00000B00,0xFFFFFBFF,0x40011004,0x00004000,0xFFFF4FFF},
9 F4 Q" Z& u" y) |/ e' i" k: S                               {0x40011004,0x000B0000,0xFFFBFFFF,0x40011400,0x00000400,0xFFFFF4FF}};
9 A1 y- M; H  J4 V% k+ Cvoid US123ART45Init(u8 iCOM,u32 baudRate,u8 Tx8Rx4,u8 priPS,u8 Ds1908,u8 St0115,u8 y1n0CRC,u8 HFr1c2)5 ?( t7 w! e9 |9 z( b% ?3 j9 u$ g
{
, U& x# u5 S9 x1 ~4 \& _& m1 m    NVIC_InitTypeDef structNVIC;         //irqNOADcom[0]=USART1_IRQn; priPS-主副优先级级别(暂定相同)2 H4 E* I& y- `
    uint32_t tmpReg=0; //参数Ds1908=1:数据9位,=0:8位;St011522315=0,1,2,3;停止位=1,0.5, 2, 1.5
7 c' A, \+ L/ Q& a* [1 F    *(volatile unsigned long *)(0x40021018)|=APB2IO_APB1US23ART45[iCOM*2-2]; //打开  GPIOX 时钟$ E  u1 n- m, U3 s- J- i
    *(volatile unsigned long *)(0x4002101C)|=APB2IO_APB1US23ART45[iCOM*2-1]; //打开U(S)ARTX时钟
; s7 z2 h3 i" \9 p- i) P9 C% K    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //所有涉及中断必须开放此时钟(外中断皆复用端口)
2 k8 G) A3 x7 A7 h0 c5 p& |; i% t    *(volatile unsigned long *)TXRX_PortSet[iCOM-1][0]|=TXRX_PortSet[iCOM-1][1]; // TX0 z3 K) C& o: I& h6 [
    *(volatile unsigned long *)TXRX_PortSet[iCOM-1][0]&=TXRX_PortSet[iCOM-1][2];
1 t- N$ \( _4 d2 m4 {    *(volatile unsigned long *)TXRX_PortSet[iCOM-1][3]|=TXRX_PortSet[iCOM-1][4]; // RX0 ^- A" v* W4 h" z
    *(volatile unsigned long *)TXRX_PortSet[iCOM-1][3]&=TXRX_PortSet[iCOM-1][5];
2 d) @( v% |" K5 E3 m. z; x5 e    tmpReg = *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x10);     // 设置 USART_CR2
5 K. n+ I6 c, G; G3 p! u1 u                                  //--.LINEN.STOP[1:0],CLKEN.CPOL.CPHA.LBCL,--.LBDIE.LBDL.--,ADD[3:0]& m1 J! e9 Z- b0 {! x  w
        tmpReg&=(uint16_t)0xCFFF; // 1  1     0    0  , 1     1    1    1  ,1   1  .... 1   //清STOP
' q5 l% r6 P4 ^' x! W        if (St0115 != 0) tmpReg |= (St0115 << 12);          // 停止位设置0-1;1-.5;2-2
; V) i* p6 {1 D& g    *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x10) = tmpReg;     // 将设置写回寄存器CR2
. v8 w$ {1 L" L) T7 h1 `$ c- `    tmpReg = *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x0C);     // 设置 USART_CR1: I2 [* l, |% q2 f& i
                        // UE M,WAKE PCE PS PEIE,TXEIE TCIE RXNEIE IDLEIE,TE RE RWU SBK
# P; o( n, U) C3 o        tmpReg&=0xE9F3; // 1  0,  1   0  0   1  ,  1    1      1     1   , 0  0   1   1  // 清M等位
/ D  u( L) T) c! _5 m! R        if (Ds1908 != 0) tmpReg |=0x00001000;              //数据位9位; 缺省 Ds1908=0数据位8位
* \0 p8 L9 X' u        if (y1n0CRC!= 0) tmpReg |=0x00000400;              //偶校验   ; 缺省y1n0CRC=0不校验
' V5 r3 T6 ?- _+ Q& p7 v        if (Tx8Rx4 != 0) tmpReg |=Tx8Rx4;                  //8-使能Tx模式;4-使能Rx模式;0xC-TxRx全能* e7 ^+ @- U4 R
    *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x0C) = tmpReg;     // 将设置写回寄存器CR1! n2 j& \3 a7 V  b4 \; j" z4 k
    tmpReg = *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x14);     // 设置 USART_CR30 X2 u6 a, j: W. z3 Q
                        // CTSIE CTSE RTSE,DMAT DMAR SCEN NACK,HDSEL IRLP IREN EIE4 q' z) i# b6 E, q3 X5 T7 [
        tmpReg&=0xFCFF; //  1     0    0  , 1    1    1    1  , 1     1    1    1  //清CTSE/RTSE( ~7 R) F/ N: L
        if (HFr1c2 != 0) tmpReg |= (HFr1c2 << 8); //HFr1c2 =0-禁止;1-RTS/2-CTS/3-R&CTS硬件流控制使能
# d2 E! r, P: ?( e    *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x14) = tmpReg;     // 将设置写回寄存器CR3! f" h% D9 F& ?* f' P3 @/ V
    switch (baudRate){  //tmpReg = *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x08);7 k. ~: ?% H! Y2 Q
        case  57600: tmpReg = COMxBaudRate[1]; break;  // ^--与下面sprintf()语句结合直接读波特率16进制
9 Z, \; t' @. v. F' s& ?        case 115200: tmpReg = COMxBaudRate[2]; break;  // 如果计算则用到下面两句:+ B$ b; t$ `' c6 x
        case 256000: tmpReg = COMxBaudRate[3]; break;  //tmpReg = (u32)Mantissa <<4; //高12位-整数部分& w, H; {1 M% Z& R0 {! E
        case   9600:                           //tmpReg |= (0x0000000F & Fraction); // 低 4位-小数部分
. @4 b' _# i2 @& C' v: }        default:     tmpReg = COMxBaudRate[0]; break;   // v--形成数组再经switch查询,写回波特率寄存器
. ~$ P+ O9 _3 r1 H! O    }           //sprintf(str,"baudRate:%8X",tmpReg); LCD_ShowString(10,160,240,180,16,(u8*)str);7 `$ ~; A9 v( ~% Y$ L$ j
    *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x08) = tmpReg;     // 将波特率写入寄存器
0 K' y& ?: U2 C    *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x0C) |=0x00002000; //使能串口9 W8 m+ a& s) b+ w$ E+ a: m' \
    *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x00) &=0xFFFFFFBF; //清除中断标志
( w' ^: _1 ~3 B    *(volatile unsigned long *)(USART_REGADDR[iCOM-1]+0x0C) |=0x00000020; //使能串口接收缓冲非空中断$ x& T8 C0 a+ W
    structNVIC.NVIC_IRQChannel =  irqNOADcom[iCOM-1];   // 串口中断通道
% F& t9 ]4 O# [5 F    structNVIC.NVIC_IRQChannelPreemptionPriority = priPS;   // 不能相同      //抢占优先级
4 N3 e5 r2 k4 X& i    structNVIC.NVIC_IRQChannelSubPriority        = priPS;   // 不能相同      //子优先级
1 D" @/ a0 t% [1 z    structNVIC.NVIC_IRQChannelCmd                = ENABLE;               //IRQ通道使能; X% \; |% Q6 A
    NVIC_Init(&structNVIC);                                          //根据指定参数初始化VIC寄存器
- `7 R2 A" P8 ~. E0 a4 g0 z}3 x3 B; D6 `6 R, W! ~
void USART2_IRQHandler(void) {      //串口2中断服务程序, switch语句专用于格式化以回车换行结束的ASCii串+ q0 }* t/ q  E4 G' W" i% J! K2 G
    u8 r=0;
5 f* t; l. v# w& f, _    static u8 i=0;
3 {: m% L! }/ O. e3 K8 V& u" q    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {  //接收中断. {5 M6 c- z, n. R$ D% [
if(ComNow!=2) ComNow=2;' A6 L: y7 H* X8 Q- F* c: u& c& N
        r=USART_ReceiveData(USART2);  //读串2到全局数组
; U* a  Y1 c* H0 x        switch (r){
9 v; b' d9 _& u: W: b            case 0x0A: iComBuf=i; i=0; break;) w( O( k$ ~# f4 X; q
            case 0x0D: USART_ClearITPendingBit(USART2,USART_IT_RXNE);  break;
  ^) V7 g3 b/ M1 E( q            default:    COMBUF[i]=r; i++; i&=0xFF; break;    // 限制在0~255之间3 S% ?! n% t, C
        }
1 Q  D8 B' V7 y  R& A, y    }. v5 i* O: ?# I  {, f# ~
    if (USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)     //溢出则必须清零# O, u" l& a# R% \/ ?  ]. @1 V
       { USART_ClearFlag(USART2, USART_FLAG_ORE); USART_ReceiveData(USART2); }
0 G7 F8 A$ b9 ?( o7 v4 a}+ {* V# r  ]7 q) N
void UART5_IRQHandler(void) {                                // 串口5中断服务程序9 p" H8 {. |" K. h
    if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) {
2 k/ H" O' [. o% V  c: l        USART_ClearITPendingBit(UART5,USART_IT_RXNE);        //清除接收中断标志
/ g( o! t; k1 y+ A$ a* t) ~ if(ComNow!=5) ComNow=5;
6 i% D* W* y, w$ R3 n! x" T0 y5 |        COMBUF[iComBuf]=USART_ReceiveData(UART5);
$ ~* U# a, K  `, k+ `" g, C2 p        iComBuf++; iComBuf&=0xFF;                            // 限制在0~255之间
/ O( v3 P2 Z+ e" E0 G% m# Z    } USART_ClearFlag(UART5,USART_FLAG_TC);
# G8 C* Z% N+ W$ n}
# v# t: {; Y# a' y0 Z! r: }1 b, f" `& kvoid UART4_IRQHandler(void) {                                // 串口4中断服务程序# U% Y, J) |( D0 g6 @- W
    if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) {
( x' J/ ^4 X( j' F        USART_ClearITPendingBit(UART4,USART_IT_RXNE);         
. q9 L- G6 x6 C( [1 G9 x  }3 B) c3 X if(ComNow!=4) ComNow=4;9 t$ F1 u2 X5 p/ u' Q  B
        COMBUF[iComBuf]=USART_ReceiveData(UART4);            //读串2到全局数组
: J: o( H" N  G0 `  r9 S        iComBuf++; iComBuf&=0xFF;                            // 限制在0~255之间3 [/ m$ G) @# T6 l
    } USART_ClearFlag(UART4,USART_FLAG_TC);0 L. r8 I0 S4 r7 x' O' l4 r
}3 u$ T$ v' t- v# z
void USART3_IRQHandler(void) {                                // 串口3中断服务程序; i3 n6 Y( D! u
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {
7 G+ t9 a( p9 U        USART_ClearITPendingBit(USART3,USART_IT_RXNE);        
0 z1 _/ b7 n% G+ y8 I if(ComNow!=3) ComNow=3;
$ Y, d* E+ j6 y! }7 i: ~        COMBUF[iComBuf]=USART_ReceiveData(USART3);            //读串3到全局数组+ d/ b! ?% b, ]9 K+ z3 f5 k
        iComBuf++; iComBuf&=0xFF;
( Y7 }$ u+ _2 M, w3 o  \3 V5 E% H    } USART_ClearFlag(USART3,USART_FLAG_TC);
/ T; `" p6 [# \% i5 `/ _8 N}) N, C7 e+ N% R* X  U7 Q
void USART1_IRQHandler(void) {           // 串口1中断服务程序,收到后随即发出去(为普中开发板而暂时保留)3 |3 l9 l/ ]8 d. [9 I. d9 k* G" S
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){  //接收中断
  |/ U% ]9 @. l" {3 ~$ a        COMBUF[255] = USART_ReceiveData(USART1);
& [0 D  y+ P' [: E8 |6 U        USART_SendData(USART1, COMBUF[255]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
' C, Z* y0 s+ i% W6 i( J- o    } USART_ClearFlag(USART1,USART_FLAG_TC);
* P6 t' v- D9 p% }}% N6 n8 t( @+ v" ]7 n$ F
struct __FILE { int handle; }; FILE __stdout; // 标准库需要的支持函数
; n; R8 \5 l6 `# X4 f_sys_exit(int x)   { x = x; }  // 定义_sys_exit()以避免使用半主机模式
8 e! P! M3 S% b5 t( n8 V- ?int fputc(int ch,FILE *p) {    // 默认函数在使用 printf函数时自动调用
% O' H' l; N$ O) M8 e5 ~' T      USART_SendData(USART1,(u8)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);return ch;5 v; c6 f3 a/ s' `
}% _! E  P0 J/ Q$ Z
//-------------------------------------------- end of AHR_USART.C -------------------------------------
: N+ a" O# t8 y/ V& h' }( N3 y//---------------- AHR_USART.H ------------------------------------------------------------------------
' P) D- [. z$ ^6 C* K( s0 M9 \#ifndef __usart_H9 m/ L: _6 h3 g: G  U8 C' S9 G
#define __usart_H7 z; Q6 }- L* r8 _
#include "aiherong.h"5 \4 M2 l( P$ `0 G: c" [
extern u8 iComBuf;            // 接收缓冲区指针+ {6 p/ f4 Y! m# U/ Z+ k
extern u8 COMBUF[256];        // 接收缓冲区,最大256个字节
" F# I% e- P* L' b; E& X/ r  N  G) pextern u8 ComNow;             // 5个COM共用公共接收缓冲区COMBUF,以此区分串口号8 j) r! ^% r% \* U! L8 w; I, D
void US123ART45Init(u8 iCOM,u32 baudRate,u8 Tx8Rx4,u8 priPS,u8 Ds1908,u8 St0115,u8 y1n0CRC,u8 HFr1c2);2 a2 E; k2 C( t' j# u3 n
#endif: ^  ?- S( ~  Q/ @
//-------------------------------------------- end of AHR_USART.H ------------------------------------
6 n/ F6 {; a% |3 i& V6 E
' ?- `3 y9 K1 [! t) ^

评分

参与人数 1 ST金币 +20 收起 理由
STMCU + 20

查看全部评分

赞 收藏 评论3 发布时间:2018-12-3 11:19

举报

3个回答
aiherong 回答时间:2018-12-3 11:22:18

* u; o0 D. T! I# `/ C5 T$ \% L0 g
$ r$ T3 c! W) ]
( K5 f" f9 q3 l' K$ n//===================== AiHeRong.H ========================== 2018-0712 ===============================
7 b( X$ K- p& ?* v7 G+ i#include "stm32f10x.h"
2 L0 s2 L4 G3 t6 k#define SYSCLK 72
/ @5 _+ j  ]: k1 m- r8 T#define REALADDR(addrNum) *((volatile unsigned long *)(addrNum))5 |( E2 Z1 o/ f- W  _, l5 c/ i
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))* {$ V: L! t# ^  z
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
9 r! \" v/ q( O" Y9 E' E+ _/ n, d* a#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) //bit-baud is CMSIS 功能 20180426
) k" K, k! r! s1 b& s+ ^, u5 q% b
//凡艾和荣编写的工程均包含该文件,包括最典型的宏定义和最广泛的移植要点!  【目标】:所有移植全在此进行!!
0 |0 W( i; E* P- O* ^4 t#include "AHR_TouchFilm.h"
. v8 ~( x( A7 J* K& D: q% Q2 E#include "AHR_SysTick.h"  K- }- q  k; |7 h2 F8 @
#include "AHR_Lcdtft.h"# p( V! G, _2 W* K/ m
#include "AHR_24Cxx.h". i$ Q! _2 Z2 ]( i4 H+ Y% l3 B# _
#include "AHR_usart.h"8 ~1 y( R  T2 Y* Y# j0 K- Q
#include "spi.h"+ e% s! M+ Y1 e+ I! K
// 各模块的依存关系要说明,独立性依次为:->SysTick->LcdTFT,24Cxx->TouchFilm-> ....
3 G8 n" z+ ?3 S: i# o; G#include  <stdio.h>% A/ n4 W% G, W( F+ T" O
#include  <stdlib.h>
0 D5 U5 U! d9 y6 H+ V9 b4 f3 ]#include  <stdarg.h>
7 G0 \7 U. W8 o8 U, ]#include  <math.h>
8 z2 N/ I5 R! ~) i9 k2 ]#include  <cpu.h>
" ~1 A( K& J$ N, D1 t9 j* O#include  <lib_def.h>9 F/ M3 P+ a/ l, e2 q
#include  <lib_ascii.h>
$ Y: f- L' |# e) h$ b- |# i#include  <lib_math.h>) K+ ?( |7 t7 k- @+ }+ a
#include  <lib_mem.h>
2 g" e2 P1 F0 O- d! f#include  <lib_str.h>5 K: O* A) t' P) a
#include  <bsp.h>* }& Q/ p5 k* W% @" `4 F
#include  <os.h>
+ d# b4 X' g( [4 J# @( }int  SystemDeviceInit(void);  // 为uCOSiii的主函数规范而集中初始化设备 全成功才返回TRUE;  201809229 J# \# y' Z4 r) G* w
// 以下暂时保留:  2018-08-09
) k1 \8 h: w! }7 F, D( C#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
, N8 y' ]# h" @#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C( |, b) W- k% c2 V: ^
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C+ o; a6 k4 y/ G% K* t  a8 }# v8 p
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
& o0 _/ B& _5 V: y- @#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C- _8 k) k0 r* P6 |- Y
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C9 _; W# p, L! r. V
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C  
) Z' e0 C  N- o% N, ^#define GPIOA_IDR_Addr    (GPIOA_BASE+ 8) //0x40010808
# z# h4 X' C& g( p#define GPIOB_IDR_Addr    (GPIOB_BASE+ 8) //0x40010C08
/ {* ?( F1 g8 m+ x+ l: A0 C& _#define GPIOC_IDR_Addr    (GPIOC_BASE+ 8) //0x40011008
7 G# ~6 b; t: M/ P2 r4 O9 ?#define GPIOD_IDR_Addr    (GPIOD_BASE+ 8) //0x40011408$ }$ w6 f* A: u/ O
#define GPIOE_IDR_Addr    (GPIOE_BASE+ 8) //0x40011808
& x2 J: \4 p$ l" P: X6 e! S#define GPIOF_IDR_Addr    (GPIOF_BASE+ 8) //0x40011A08( [# s; d5 f. N  ?0 u
#define GPIOG_IDR_Addr    (GPIOG_BASE+ 8) //0x40011E08
5 ]; D) n; b# \1 h6 }, C- u/ `: b//IO口操作,只对单一的IO口! //确保n的值小于16!$ @& V: _" o' Y% j/ Z9 Q
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 * S9 l5 g- ~' F7 y$ M2 L  n
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入
: X1 _/ r, C$ j) ]& T3 C0 I#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 4 T4 w7 b8 c( H. T) s) G3 _8 }
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 7 |/ r# \) e# F# N
#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出
: V$ |$ g. O1 A& p#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入
3 R+ j" T( k- P$ K; l9 k#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 4 U4 A/ O$ k( @2 _
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 & ^9 Y2 W* d2 t, c$ ^1 ]. v8 A
#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出
! k; k. `3 d0 ?5 j* h9 N1 I7 o#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入
; x, ~! d! D: b/ C7 s% O3 P$ u- X#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 ! ?  \/ H$ o3 p5 g2 a4 E
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入7 M$ L* R" T1 [* Z; f& }# U
#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 * z: X% w6 q; D1 G7 r
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入5 X) @! ~& A4 T. R. M% k( R9 t
//------------------------------------------------------ end of AiHeRong.H ----------------------------
aiherong 回答时间:2019-1-9 19:59:41
以下是在main()显示接收缓冲区内容:9 c! h+ m/ T" m" r% V% t: B! M, m$ q
while (USART_GetITStatus(USART2,USART_IT_RXNE)==RESET) //在接收中断之外读全局数组COMBUF
1 i+ M+ ?$ G7 [- t7 o: R4 g            if((REALADDR(USART2_BASE)&0x20)==0) 或 if(USART_GetITStatus(USART2,USART_IT_RXNE)==RESET)0 U/ y7 ?* z' f1 I
       for (i=iComBuf;i<N_BUF;i++) {: n4 s2 G& \* ~* |2 g9 ?' z
            LCD_ShowChar(i*8,60,(char)COMBUF[i],16,0);
3 |" g+ \: c5 d5 V+ u       }
aiherong 回答时间:2019-4-26 07:56:03
由于时间局促去了解USART而写了上面帖子,其中存有缺陷: 没有注意到USART1挂APB2这一特殊性,从而波特率数组里对应的值都要减半!(其它串口不必改动)
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版