📄 model.lst
字号:
(0033) * v0.40 增加了串口发送进程。增加了原子操作。 *
(0034) * v1.00 针对新规范进行了修改,增加自动收发进程。 *
(0035) * -------------------------------------------------------- *
(0036) * [使用说明] *
(0037) * 1、通过SERIAL_RX_BUFF_SIZE来设定接收缓冲区的大 *
(0038) * 小;通过SERIAL_TX_BUFF_SIZE来设定发送缓冲区 *
(0039) * 的大小。 *
(0040) * 2、通过定义_USE_SERIAL_RX_BUFF来选择添加一个接 *
(0041) * 收缓冲区;通过定义_USE_SERIAL_TX_BUFF来添加 *
(0042) * 一个发送缓冲区。 *
(0043) * 3、在取数的时候,有时候要考虑屏蔽中断,否则会 *
(0044) * 出现不可预知的后果。 *
(0045) * 4、可以通过宏_USE_SERIAL_TX_TRANSMITTER_PROC在 *
(0046) * 使用发送缓冲时,使用自动发送进程。并需要定 *
(0047) * 义宏UDR_PORT来指定发送端口、也需要将宏 *
(0048) * SERIAL_INSERT_USART_TX_ISR_CODE插入到发送完 *
(0049) * 成中断处理程序中。 *
(0050) * 5、使用宏SERIAL_ENABLE_WRITE定义额外的发送使能 *
(0051) * 代码。例如485总线的发送使能等。 *
(0052) * 6、使用宏SERIAL_DISABLE_WRITE定义额外的发送使 *
(0053) * 能关闭代码。例如485总线发送使能的关闭。 *
(0054) ***********************************************************/
(0055)
(0056) /********************
(0057) * 头 文 件 配 置 区 *
(0058) ********************/
(0059) # include "LIB_Config.h"
(0060) # include "RD_MacroAndConst.h"
(0061) # include "RD_UseSerialBuff.h"
(0062)
(0063) /********************
(0064) * 系 统 宏 定 义 *
(0065) ********************/
(0066)
(0067) /*------------------*
(0068) * 常 数 宏 定 义 *
(0069) *------------------*/
(0070) #ifndef SERIAL_RX_BUFF_SIZE
(0071) # define SERIAL_RX_BUFF_SIZE 32
(0072) #endif
(0073) #ifndef SERIAL_TX_BUFF_SIZE
(0074) # define SERIAL_TX_BUFF_SIZE 32
(0075) #endif
(0076) #ifdef _USE_SERIAL_TX_TRANSMITTER_PROC
(0077) #ifndef UDR_PORT
(0078) # error Need for UDR_PORT!
(0079) #endif
(0080)
(0081) #ifndef SERIAL_ENABLE_WRITE
(0082) # define SERIAL_ENABLE_WRITE
(0083) #endif
(0084)
(0085) #ifndef SERIAL_DISABLE_WRITE
(0086) # define SERIAL_DISABLE_WRITE
(0087) #endif
(0088) #endif
(0089) /********************
(0090) * 函 数 声 明 区 *
(0091) ********************/
(0092) #ifdef _USE_SERIAL_RX_BUFF
(0093) BOOL UARTaddDataToRxBuff(uint8 Data);
(0094) BOOL UARTgetDataFromRxBuff(uint8 *Data);
(0095) #endif
(0096)
(0097) #ifdef _USE_SERIAL_TX_BUFF
(0098) BOOL UARTaddDataToTxBuff(uint8 Data);
(0099) BOOL UARTgetDataFromTxBuff(uint8 *Data);
(0100) #ifdef _USE_SERIAL_TX_TRANSMITTER_PROC
(0101) BOOL PROC_Serial_Transmitter(void);
(0102) #endif
(0103) #endif
(0104)
(0105) /********************
(0106) * 模块变量定义区 *
(0107) ********************/
(0108) #ifdef _USE_SERIAL_RX_BUFF
(0109) static uint8 UARTRxBuff[SERIAL_RX_BUFF_SIZE];
(0110) static unsigned int UARTRxBuffHead = 0;
(0111) static unsigned int UARTRxBuffTail = 0;
(0112) static unsigned int UARTRxBuffCounter = 0;
(0113) #endif
(0114)
(0115) #ifdef _USE_SERIAL_TX_BUFF
(0116) static uint8 UARTTxBuff[SERIAL_TX_BUFF_SIZE];
(0117) static unsigned int UARTTxBuffHead = 0;
(0118) static unsigned int UARTTxBuffTail = 0;
(0119) static unsigned int UARTTxBuffCounter = 0;
(0120) #endif
(0121)
(0122) /********************
(0123) * 全局变量定义区 *
(0124) ********************/
(0125) #ifdef _USE_SERIAL_TX_BUFF
(0126) #ifdef _USE_SERIAL_TX_TRANSMITTER_PROC
(0127) BOOL g_bIfSerialTransmitCompleted = TRUE;
(0128) #endif
(0129) #endif
(0130)
(0131) /***********************************************************
(0132) * 函数说明:接收缓冲区取值函数 *
(0133) * 输入: 存储取出数据地址的指针 *
(0134) * 输出: 取值是否成功 *
(0135) * 调用函数:无 *
(0136) ***********************************************************/
(0137) #ifdef _USE_SERIAL_RX_BUFF
(0138) BOOL UARTgetDataFromRxBuff(uint8 *Data)
(0139) {
(0140) SAFE_CODE_PERFORMANCE
_UARTgetDataFromRxBuff:
Data --> R16
98 94F8 BCLR 7
99 9020 0104 LDS R2,RD_UseSerialBuff.c:UARTRxBuffTail
9B 9030 0105 LDS R3,RD_UseSerialBuff.c:UARTRxBuffTail+1
9D 9040 0102 LDS R4,RD_UseSerialBuff.c:UARTRxBuffHead
9F 9050 0103 LDS R5,RD_UseSerialBuff.c:UARTRxBuffHead+1
A1 1442 CP R4,R2
A2 0453 CPC R5,R3
A3 F459 BNE 0x00AF
A4 9020 0106 LDS R2,UARTRxBuffCounter
A6 9030 0107 LDS R3,UARTRxBuffCounter+1
A8 2022 TST R2
A9 F429 BNE 0x00AF
AA 2033 TST R3
AB F419 BNE 0x00AF
AC 9478 BSET 7
AD 2700 CLR R16
AE C02B RJMP 0x00DA
AF 9020 0102 LDS R2,RD_UseSerialBuff.c:UARTRxBuffHead
B1 9030 0103 LDS R3,RD_UseSerialBuff.c:UARTRxBuffHead+1
B3 01C1 MOVW R24,R2
B4 9601 ADIW R24,1
B5 9390 0103 STS RD_UseSerialBuff.c:UARTRxBuffHead+1,R25
B7 9380 0102 STS RD_UseSerialBuff.c:UARTRxBuffHead,R24
B9 E989 LDI R24,0x99
BA E091 LDI R25,1
BB 01F1 MOVW R30,R2
BC 0FE8 ADD R30,R24
BD 1FF9 ADC R31,R25
BE 8020 LDD R2,Z+0
BF 01F8 MOVW R30,R16
C0 8220 STD Z+0,R2
C1 9180 0106 LDS R24,UARTRxBuffCounter
C3 9190 0107 LDS R25,UARTRxBuffCounter+1
C5 9701 SBIW R24,1
C6 9390 0107 STS UARTRxBuffCounter+1,R25
C8 9380 0106 STS UARTRxBuffCounter,R24
CA 9180 0102 LDS R24,RD_UseSerialBuff.c:UARTRxBuffHead
CC 9190 0103 LDS R25,RD_UseSerialBuff.c:UARTRxBuffHead+1
CE 3880 CPI R24,0x80
CF E0E0 LDI R30,0
D0 079E CPC R25,R30
D1 F431 BNE 0x00D8
D2 2422 CLR R2
D3 2433 CLR R3
D4 9230 0103 STS RD_UseSerialBuff.c:UARTRxBuffHead+1,R3
D6 9220 0102 STS RD_UseSerialBuff.c:UARTRxBuffHead,R2
D8 9478 BSET 7
(0141) (
(0142) if ((UARTRxBuffHead == UARTRxBuffTail)
(0143) && (UARTRxBuffCounter == 0))
(0144) {
(0145) SEI();
(0146) return FALSE;
(0147) }
(0148) (*Data) = UARTRxBuff[UARTRxBuffHead++];
(0149)
(0150) UARTRxBuffCounter--;
(0151)
(0152) if (UARTRxBuffHead == SERIAL_RX_BUFF_SIZE)
(0153) {
(0154) UARTRxBuffHead = 0;
(0155) }
(0156) )
(0157) return TRUE;
D9 E001 LDI R16,1
DA 9508 RET
(0158) }
(0159)
(0160) /***********************************************************
(0161) * 函数说明:接收缓冲区首数据察看函数 *
(0162) * 输入: 存储取出数据地址的指针 *
(0163) * 输出: 取值是否成功 *
(0164) * 调用函数:无 *
(0165) ***********************************************************/
(0166) BOOL UARTPeekDataFromRxBuff(uint8 *pData)
(0167) {
(0168) SAFE_CODE_PERFORMANCE
_UARTPeekDataFromRxBuff:
pData --> R16
DB 94F8 BCLR 7
DC 9020 0104 LDS R2,RD_UseSerialBuff.c:UARTRxBuffTail
DE 9030 0105 LDS R3,RD_UseSerialBuff.c:UARTRxBuffTail+1
E0 9040 0102 LDS R4,RD_UseSerialBuff.c:UARTRxBuffHead
E2 9050 0103 LDS R5,RD_UseSerialBuff.c:UARTRxBuffHead+1
E4 1442 CP R4,R2
E5 0453 CPC R5,R3
E6 F459 BNE 0x00F2
E7 9020 0106 LDS R2,UARTRxBuffCounter
E9 9030 0107 LDS R3,UARTRxBuffCounter+1
EB 2022 TST R2
EC F429 BNE 0x00F2
ED 2033 TST R3
EE F419 BNE 0x00F2
EF 9478 BSET 7
F0 2700 CLR R16
F1 C00D RJMP 0x00FF
F2 E989 LDI R24,0x99
F3 E091 LDI R25,1
F4 91E0 0102 LDS R30,RD_UseSerialBuff.c:UARTRxBuffHead
F6 91F0 0103 LDS R31,RD_UseSerialBuff.c:UARTRxBuffHead+1
F8 0FE8 ADD R30,R24
F9 1FF9 ADC R31,R25
FA 8020 LDD R2,Z+0
FB 01F8 MOVW R30,R16
FC 8220 STD Z+0,R2
FD 9478 BSET 7
(0169) (
(0170) if ((UARTRxBuffHead == UARTRxBuffTail)
(0171) && (UARTRxBuffCounter == 0))
(0172) {
(0173) SEI();
(0174) return FALSE;
(0175) }
(0176) (*pData) = UARTRxBuff[UARTRxBuffHead];
(0177) )
(0178) return TRUE;
FE E001 LDI R16,1
FF 9508 RET
(0179) }
(0180)
(0181) /***********************************************************
(0182) * 函数说明:向通讯输入缓冲区添加数据函数 *
(0183) * 输入: 收到的数据 *
(0184) * 输出: 无 *
(0185) * 调用函数:无 *
(0186) ***********************************************************/
(0187) BOOL UARTaddDataToRxBuff(uint8 Data)
(0188) {
(0189) SAFE_CODE_PERFORMANCE
_UARTaddDataToRxBuff:
Data --> R16
100 94F8 BCLR 7
101 9020 0104 LDS R2,RD_UseSerialBuff.c:UARTRxBuffTail
103 9030 0105 LDS R3,RD_UseSerialBuff.c:UARTRxBuffTail+1
105 9040 0102 LDS R4,RD_UseSerialBuff.c:UARTRxBuffHead
107 9050 0103 LDS R5,RD_UseSerialBuff.c:UARTRxBuffHead+1
109 1442 CP R4,R2
10A 0453 CPC R5,R3
10B F459 BNE 0x0117
10C 9180 0106 LDS R24,UARTRxBuffCounter
10E 9190 0107 LDS R25,UARTRxBuffCounter+1
110 3880 CPI R24,0x80
111 E0E0 LDI R30,0
112 079E CPC R25,R30
113 F419 BNE 0x0117
114 9478 BSET 7
115 2700 CLR R16
116 C029 RJMP 0x0140
117 9020 0104 LDS R2,RD_UseSerialBuff.c:UARTRxBuffTail
119 9030 0105 LDS R3,RD_UseSerialBuff.c:UARTRxBuffTail+1
11B 01C1 MOVW R24,R2
11C 9601 ADIW R24,1
11D 9390 0105 STS RD_UseSerialBuff.c:UARTRxBuffTail+1,R25
11F 9380 0104 STS RD_UseSerialBuff.c:UARTRxBuffTail,R24
121 E989 LDI R24,0x99
122 E091 LDI R25,1
123 01F1 MOVW R30,R2
124 0FE8 ADD R30,R24
125 1FF9 ADC R31,R25
126 8300 STD Z+0,R16
127 9180 0106 LDS R24,UARTRxBuffCounter
129 9190 0107 LDS R25,UARTRxBuffCounter+1
12B 9601 ADIW R24,1
12C 9390 0107 STS UARTRxBuffCounter+1,R25
12E 9380 0106 STS UARTRxBuffCounter,R24
130 9180 0104 LDS R24,RD_UseSerialBuff.c:UARTRxBuffTail
132 9190 0105 LDS R25,RD_UseSerialBuff.c:UARTRxBuffTail+1
134 3880 CPI R24,0x80
135 E0E0 LDI R30,0
136 079E CPC R25,R30
137 F431 BNE 0x013E
138 2422 CLR R2
139 2433 CLR R3
13A 9230 0105 STS RD_UseSerialBuff.c:UARTRxBuffTail+1,R3
13C 9220 0104 STS RD_UseSerialBuff.c:UARTRxBuffTail,R2
13E 9478 BSET 7
(0190) (
(0191) if ((UARTRxBuffHead == UARTRxBuffTail)
(0192) && (UARTRxBuffCounter == SERIAL_RX_BUFF_SIZE))
(0193) {
(0194) SEI();
(0195) return FALSE;
(0196) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -