1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
引言
最近在做一个智能垃圾桶的项目,小区用的那种不是家里面的那种哈,由于需要四个垃圾桶,所以挂载多个模组就是一个比较麻烦的事情,一般STM32的芯片最多就只有八个串口,所以选择拓展串口的方式来做。 主题 使用的是CH438Q串口拓展芯片,芯片是QFP44元引脚的封装,座板也比较好做,或者买一个 同样封装的芯片夹具也可以使用。这里贴一下原理图 因为我这里用的是地址与数据复用模式所以A0~A6没用 这里要注意RST引脚是低电平复位,所以需要上拉 不要悬空 代码部分 我这里使用的是用IO口模拟 当然你也可以用FSMC去做 代码思路 CH438_Init(); //初始化你的引脚 CH438_ResetSeril(5); //复位你的串口 CH438_Uart_Init(5,4800); //配置你的串口 OK进入主题 1 2 3 4 #include "CH485.h" #include "delay.h" #include "usart.h" #include "stm32f4xx_hal_eth.h" #include "string.h" #include "sys.h" #define Fpclk 1843200//666600 /* 定义内部时钟频率,默认外部晶振的12分频 */ #define MaxRecvLen 50 /* 接收缓冲区大小 */ #define CH438_CONL_PORT GPIOB #define CH438_DATA_PORT GPIOB #define CH438_DATA_PORT1 GPIO #define CH438_DATA_PIN ((uint16_t)0x00FF) //数据地址引脚 PB0-7 const unsigned char offsetadd[] = {0x00,0x10,0x20,0x30,0x08,0x18,0x28,0x38,}; /* 串口号的偏移地址 */ const unsigned char Interruptnum[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; /* SSR寄存器中断号对应值 */ unsigned char Revbuff[MaxRecvLen]; /* 接收缓存区 */ unsigned char RevLen; /* 接收计数 */ void SetOutPut(uint16_t GPIO_Pin) //IO输出模式 { GPIO_InitTypeDef CH438_gpio; CH438_gpio.Pin = GPIO_Pin; CH438_gpio.Speed = GPIO_SPEED_HIGH; CH438_gpio.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出 HAL_GPIO_Init(CH438_DATA_PORT, &CH438_gpio); } void SetInPut(uint16_t GPIO_Pin)//IO输入模式 { GPIO_InitTypeDef CH438_gpio; CH438_gpio.Pin = GPIO_Pin; CH438_gpio.Speed = GPIO_SPEED_HIGH; CH438_gpio.Mode = GPIO_MODE_INPUT; //上拉输入 HAL_GPIO_Init(CH438_DATA_PORT, &CH438_gpio); } void CH438_Init() //IO口中断等初始化 { GPIO_InitTypeDef GPIO_InitStructure; __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟 __HAL_RCC_GPIOD_CLK_ENABLE(); //开启GPIOB时钟 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pin = 0X00FF; GPIO_InitStructure.Speed = GPIO_SPEED_MEDIUM; HAL_GPIO_Init(CH438_DATA_PORT,&GPIO_InitStructure); GPIO_InitStructure.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; HAL_GPIO_Init(GPIOD,&GPIO_InitStructure); GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStructure.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOD,&GPIO_InitStructure); HAL_NVIC_SetPriority(EXTI2_IRQn,2,1); //抢占优先级为2,子优先级为1 HAL_NVIC_EnableIRQ(EXTI2_IRQn); //使能中断线2 AMOD = 1; } //中断服务函数 void EXTI2_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);//调用中断处理公用函数 } //中断服务程序中需要做的事情 //在HAL库中所有的外部中断服务函数都会调用此函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_2) { u8 gInterruptStatus; u8 InterruptStatus; u8 i; gInterruptStatus = CH438ReadReg( REG_SSR_ADDR ); //printf("rnSSR: %02xrn",gInterruptStatus ); if(!gInterruptStatus) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); return ; } for(i=0; i<8; i++) { if( gInterruptStatus & Interruptnum ) /* 检测哪个串口发生中断 */ { InterruptStatus = CH438ReadReg( offsetadd | REG_IIR_ADDR ) & 0x0f; /* 读串口的中断状态 */ //printf("rnInterruptStatus: %02xrn",InterruptStatus ); switch( InterruptStatus ) { case INT_NOINT: /* 没有中断 */ break; case INT_THR_EMPTY: /* THR空中断 */ break; case INT_RCV_OVERTIME: /* 接收超时中断 */ RevLen = CH438_RecvDatas(i, Revbuff); CH438_SendDatas(i, Revbuff, RevLen); printf("USART:%d ->",i); printf("DATA:%srn",Revbuff ); memset(Revbuff,0,RevLen); break; case INT_RCV_SUCCESS: /* 接收数据可用中断 */ RevLen = CH438_RecvDatas(i, Revbuff); CH438_SendDatas(i, Revbuff, RevLen); break; case INT_RCV_LINES: /* 接收线路状态中断 */ CH438ReadReg( offsetadd | REG_LSR_ADDR ); break; case INT_MODEM_CHANGE: /* MODEM输入变化中断 */ CH438ReadReg( offsetadd | REG_MSR_ADDR ); break; default: break; } } } } } void CH438WriteReg(u8 add,u8 data) //写一个字节到寄存器 { //CH438_DATA_PORT->ODR = (CH438_DATA_PORT->ODR&0XFF00); CS = 1; WR = 1; RD = 1; SetOutPut(CH438_DATA_PIN); CH438_DATA_PORT->ODR = (CH438_DATA_PORT->ODR&0XFF00)|add; //低八位十数据位确保高八位数据不变 写寄存器地址 CS = 0; ALE =1; delay_us(1); ALE = 0; CH438_DATA_PORT->ODR = (CH438_DATA_PORT->ODR&0XFF00)|data; //写数据 WR =0 ; delay_us(1); WR =1; CS =1; } u8 CH438ReadReg(u8 add) //读取一个字节 { u8 value; CS = 1; WR =1; RD =1; SetOutPut(CH438_DATA_PIN); // CS = 0; ALE =1; CH438_DATA_PORT->ODR = (CH438_DATA_PORT->ODR&0XFF00)|add; ALE = 0; SetInPut(CH438_DATA_PIN); RD = 0; value = (uint8_t)CH438_DATA_PORT->IDR; RD =1; CS =1; //printf("value: %02xrn",value); return value; } unsigned char CH438_CheckIIR(unsigned char num) { unsigned char value; value = CH438ReadReg( offsetadd[num] | REG_IIR_ADDR ); return value; } void CH438_CloseSeril(unsigned char num) //关闭某位串口 { CH438WriteReg(offsetadd[num]|REG_IER_ADDR, BIT_IER_LOWPOWER); } void CH438_CloseALLSeril(void) //关闭所有串口 { CH438WriteReg(offsetadd[0]|REG_IER_ADDR, BIT_IER_LOWPOWER|BIT_IER_SLP); } void CH438_ResetSeril(unsigned char num) //复位串口 { CH438WriteReg(offsetadd[num]|REG_IER_ADDR, BIT_IER_RESET); } void CH438_SetBandrate(unsigned char num, unsigned long value)//设置波特率 未使用此函数 { uint16_t bandspeed; bandspeed = Fpclk/16/value; CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, BIT_LCR_DLAB ); CH438WriteReg(offsetadd[num]|REG_DLL_ADDR, (uint8_t)bandspeed); CH438WriteReg(offsetadd[num]|REG_DLM_ADDR, (uint8_t)(bandspeed>>8)); printf("bandrate: %drn", bandspeed); printf("DLM: %drn", CH438ReadReg(offsetadd[num]|REG_DLM_ADDR)); printf("DLL: %drn", CH438ReadReg(offsetadd[num]|REG_DLL_ADDR)); } void CH438_UARTInit(unsigned char num)//初始化 未使用到 { CH438_SetBandrate(num, 9600); /* CH438串口1波特率设置 */ CH438_TranConfig(num); /* CH438串口1数据格式配置及FIFO大小 */ } //发送数据 void CH438_SendDatas(unsigned char num, unsigned char* sendbuff,unsigned char len) { while(len) { if((CH438ReadReg(offsetadd[num]|REG_LSR_ADDR)&BIT_LSR_TEMT)) //LSR->THRE==1 保持寄存器空 { CH438WriteReg(offsetadd[num]|REG_THR_ADDR, *sendbuff++); len--; } } } //接收数据 unsigned char CH438_RecvDatas(unsigned char num, unsigned char* revbuff) { uint8_t len=0; uint8_t *p_rev; p_rev = revbuff; while( ( CH438ReadReg( offsetadd[num]|REG_LSR_ADDR ) & BIT_LSR_DATARDY ) == 0 ); /*等待数据准备好 */ while((CH438ReadReg(offsetadd[num]|REG_LSR_ADDR)&BIT_LSR_DATARDY)) //LSR->DATARDY==1 { *p_rev = CH438ReadReg(offsetadd[num]|REG_RBR_ADDR); p_rev++; len++; } return len; } void CH438_TranConfig(unsigned char num) { /* 发送数据格式:8位数据,无校验,1个停止位 */ CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, BIT_LCR_WORDSZ1 | BIT_LCR_WORDSZ0); /* 设置FIFO模式,触发点为112字节 */ CH438WriteReg(offsetadd[num]|REG_FCR_ADDR, BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN); CH438WriteReg(offsetadd[num]|REG_FCR_ADDR,CH438ReadReg(offsetadd[num]|REG_FCR_ADDR)| BIT_FCR_TFIFORST|BIT_FCR_RFIFORST); } void CH438_INTConfig(unsigned char num) { /* 注意: CH438打开BIT_IER_IETHRE中断(0->1),会产生一个发生空中断 */ CH438WriteReg(offsetadd[num]|REG_IER_ADDR,BIT_IER_IERECV ); CH438_CheckIIR(num); CH438WriteReg(offsetadd[num]|REG_MCR_ADDR, BIT_MCR_OUT2);// | BIT_MCR_RTS | BIT_MCR_DTR);//可以产生一个实际的中断 } void CH438_AutoHFCtrl(unsigned char num) { CH438WriteReg( offsetadd[num]|REG_MCR_ADDR, BIT_MCR_AFE | BIT_MCR_OUT2 | BIT_MCR_RTS );/* 设置MCR寄存器的AFE和RTS为1 */ } void CH438_RegTEST(unsigned char num)//测试使用的函数 { printf("current test serilnum: %02x rn",(unsigned short)offsetadd[num]); printf("IER: %02xrn",(unsigned short)CH438ReadReg(offsetadd[num] | REG_IER_ADDR));//?IER printf("IIR: %02xrn",(unsigned short)CH438ReadReg(offsetadd[num] | REG_IIR_ADDR));//?IIR printf("LCR: %02xrn",(unsigned short)CH438ReadReg(offsetadd[num] | REG_LCR_ADDR));//?LCR printf("MCR: %02xrn",(unsigned short)CH438ReadReg(offsetadd[num] | REG_MCR_ADDR));//?MCR printf("LSR: %02xrn",(unsigned short)CH438ReadReg(offsetadd[num] | REG_LSR_ADDR));//?LSR printf("MSR: %02xrn",(unsigned short)CH438ReadReg(offsetadd[num] | REG_MSR_ADDR));//?MSR // CH438WriteReg(offsetadd[num] | REG_SCR_ADDR, 0x78); printf("SCR: %02xrn",(unsigned short)CH438ReadReg(offsetadd[num] | REG_SCR_ADDR));//?SCR printf("FCR: %02xrn",(unsigned short)CH438ReadReg(offsetadd[num] | REG_FCR_ADDR));//?SCR //printf("SSR: %02xrn",(unsigned short)CH438ReadReg( offsetadd[num] | REG_SSR_ADDR ));//?SCR } //串口初始化函数 输入参数 串口号和波特率 void CH438_Uart_Init(unsigned char num,unsigned long value) { uint8_t dlab=0; uint16_t bandspeed; dlab = CH438ReadReg(offsetadd[num]|REG_IER_ADDR); dlab &= 0xDF; CH438WriteReg(offsetadd[num]|REG_IER_ADDR, dlab); dlab = CH438ReadReg(offsetadd[num]|REG_LCR_ADDR); dlab |= 0x80; //置LCR寄存器DLAB位为1 CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, dlab); bandspeed = Fpclk/16/value; CH438WriteReg(offsetadd[num]|REG_DLL_ADDR, (uint8_t)bandspeed); CH438WriteReg(offsetadd[num]|REG_DLM_ADDR, (uint8_t)(bandspeed>>8)); dlab &= 0x7F; //置IIR寄存器DLAB位为0 CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, dlab); CH438WriteReg(offsetadd[num]|REG_FCR_ADDR,BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN ); CH438WriteReg(offsetadd[num]|REG_LCR_ADDR,BIT_LCR_WORDSZ1 | BIT_LCR_WORDSZ0 ); //CH438WriteReg(offsetadd[num]|REG_IER_ADDR,BIT_IER_IELINES | BIT_IER_IETHRE | BIT_IER_IERECV); //CH438WriteReg(offsetadd[num]|REG_MCR_ADDR,BIT_MCR_OUT2 | BIT_MCR_RTS | BIT_MCR_DTR); CH438WriteReg(offsetadd[num]|REG_FCR_ADDR,CH438ReadReg(offsetadd[num]|REG_FCR_ADDR)| BIT_FCR_TFIFORST|BIT_FCR_RFIFORST); //CH438_TranConfig(num); CH438_INTConfig(num); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 自己要注意看官方的文档来选择打开什么中断、我开始遇到问题为什么每次发送都进入中断,因为在初始化的时候开启了发送完成中断,如果初始化的时候只打开了接受中断、那么只有当接受的时候才会触发一次中断,然后我们进入中断去读取IIR寄存器去判断中断类型 #ifndef _CH485_H #define _CH485_H #include "sys.h" #include "delay.h" #define REG_RBR_ADDR 0x00 /* 串口0接收缓冲寄存器地址 */ #define REG_THR_ADDR 0x00 /* 串口0发送保持寄存器地址 */ #define REG_IER_ADDR 0x01 /* 串口0中断使能寄存器地址 */ #define REG_IIR_ADDR 0x02 /* 串口0中断识别寄存器地址 */ #define REG_FCR_ADDR 0x02 /* 串口0FIFO控制寄存器地址 */ #define REG_LCR_ADDR 0x03 /* 串口0线路控制寄存器地址 */ #define REG_MCR_ADDR 0x04 /* 串口0MODEM控制寄存器地址 */ #define REG_LSR_ADDR 0x05 /* 串口0线路状态寄存器地址 */ #define REG_MSR_ADDR 0x06 /* 串口0MODEM状态寄存器地址 */ #define REG_SCR_ADDR 0x07 /* 串口0用户可定义寄存器地址 */ #define REG_DLL_ADDR 0x00 /* 波特率除数锁存器低8位字节地址 */ #define REG_DLM_ADDR 0x01 /* 波特率除数锁存器高8位字节地址 */ /* CH438内部串口0~7 专用状态寄存器 */ #define REG_SSR_ADDR 0x4F /* 专用状态寄存器地址 */ /* IER寄存器的位 */ #define BIT_IER_RESET 0x80 /* 该位置1则软复位该串口 */ #define BIT_IER_LOWPOWER 0x40 /* 该位为1则关闭该串口的内部基准时钟 */ #define BIT_IER_SLP 0x20 /* 串口0是SLP,为1则关闭时钟震荡器 */ #define BIT_IER1_CK2X 0x20 /* 串口1是CK2X,为1则强制将外部时钟信号2倍频后作为内部基准时钟 */ #define BIT_IER_IEMODEM 0x08 /* 该位为1允许MODEM输入状态变化中断 */ #define BIT_IER_IELINES 0x04 /* 该位为1允许接收线路状态中断 */ #define BIT_IER_IETHRE 0x02 /* 该位为1允许发送保持寄存器空中断 */ #define BIT_IER_IERECV 0x01 /* 该位为1允许接收到数据中断 */ /* IIR寄存器的位 */ #define BIT_IIR_FIFOENS1 0x80 #define BIT_IIR_FIFOENS0 0x40 /* 该2位为1表示起用FIFO */ /* 中断类型:0001没有中断,0110接收线路状态中断,0100接收数据可用中断,1100接收数据超时中断,0010THR寄存器空中断,0000MODEM输入变化中断 */ #define BIT_IIR_IID3 0x08 #define BIT_IIR_IID2 0x04 //接受数据可用 #define BIT_IIR_IID1 0x02 //THR寄存器空中断 #define BIT_IIR_NOINT 0x01 /* FCR寄存器的位 */ /* 触发点: 00对应1个字节,01对应16个字节,10对应64个字节,11对应112个字节 */ #define BIT_FCR_RECVTG1 0x80 /* 设置FIFO的中断和自动硬件流控制的触发点 */ #define BIT_FCR_RECVTG0 0x40 /* 设置FIFO的中断和自动硬件流控制的触发点 */ #define BIT_FCR_TFIFORST 0x04 /* 该位置1则清空发送FIFO中的数据 */ #define BIT_FCR_RFIFORST 0x02 /* 该位置1则清空接收FIFO中的数据 */ #define BIT_FCR_FIFOEN 0x01 /* 该位置1则起用FIFO,为0则禁用FIFO */ /* LCR寄存器的位 */ #define BIT_LCR_DLAB 0x80 /* 为1才能存取DLL,DLM,为0才能存取RBR/THR/IER */ #define BIT_LCR_BREAKEN 0x40 /* 为1则强制产生BREAK线路间隔*/ /* 设置校验格式:当PAREN为1时,00奇校验,01偶校验,10标志位(MARK,置1),11空白位(SPACE,清0) */ #define BIT_LCR_PARMODE1 0x20 /* 设置奇偶校验位格式 */ #define BIT_LCR_PARMODE0 0x10 /* 设置奇偶校验位格式 */ #define BIT_LCR_PAREN 0x08 /* 为1则允许发送时产生和接收校验奇偶校验位 */ #define BIT_LCR_STOPBIT 0x04 /* 为1则两个停止位,为0一个停止位 */ /* 设置字长度:00则5个数据位,01则6个数据位,10则7个数据位,11则8个数据位 */ #define BIT_LCR_WORDSZ1 0x02 /* 设置字长长度 */ #define BIT_LCR_WORDSZ0 0x01 /* MCR寄存器的位 */ #define BIT_MCR_AFE 0x20 /* 为1允许CTS和RTS硬件自动流控制 */ #define BIT_MCR_LOOP 0x10 /* 为1使能内部回路的测试模式 */ #define BIT_MCR_OUT2 0x08 /* 为1允许该串口的中断请求输出 */ #define BIT_MCR_OUT1 0x04 /* 为用户定义的MODEM控制位 */ #define BIT_MCR_RTS 0x02 /* 该位为1则RTS引脚输出有效 */ #define BIT_MCR_DTR 0x01 /* 该位为1则DTR引脚输出有效 */ /* LSR寄存器的位 */ #define BIT_LSR_RFIFOERR 0x80 /* 为1表示在接收FIFO中存在至少一个错误 */ #define BIT_LSR_TEMT 0x40 /* 为1表示THR和TSR全空 */ #define BIT_LSR_THRE 0x20 /* 为1表示THR空*/ #define BIT_LSR_BREAKINT 0x10 /* 该位为1表示检测到BREAK线路间隔 */ #define BIT_LSR_FRAMEERR 0x08 /* 该位为1表示读取数据帧错误 */ #define BIT_LSR_PARERR 0x04 /* 该位为1表示奇偶校验错误 */ #define BIT_LSR_OVERR 0x02 /* 为1表示接收FIFO缓冲区溢出 */ #define BIT_LSR_DATARDY 0x01 /* 该位为1表示接收FIFO中有接收到的数据 */ /* MSR寄存器的位 */ #define BIT_MSR_DCD 0x80 /* 该位为1表示DCD引脚有效 */ #define BIT_MSR_RI 0x40 /* 该位为1表示RI引脚有效 */ #define BIT_MSR_DSR 0x20 /* 该位为1表示DSR引脚有效 */ #define BIT_MSR_CTS 0x10 /* 该位为1表示CTS引脚有效 */ #define BIT_MSR_DDCD 0x08 /* 该位为1表示DCD引脚输入状态发生变化过 */ #define BIT_MSR_TERI 0x04 /* 该位为1表示RI引脚输入状态发生变化过 */ #define BIT_MSR_DDSR 0x02 /* 该位为1表示DSR引脚输入状态发生变化过 */ #define BIT_MSR_DCTS 0x01 /* 该位为1表示CTS引脚输入状态发生变化过 */ /* 中断状态码 */ #define INT_NOINT 0x01 /* 没有中断 */ #define INT_THR_EMPTY 0x02 /* THR空中断 */ #define INT_RCV_OVERTIME 0x0C /* 接收超时中断 */ #define INT_RCV_SUCCESS 0x04 /* 接收数据可用中断 */ #define INT_RCV_LINES 0x06 /* 接收线路状态中断 */ #define INT_MODEM_CHANGE 0x00 /* MODEM输入变化中断 */ #define CH438_IIR_FIFOS_ENABLED 0xC0 /* 起用FIFO */ #define WR PDout(3) #define ALE PDout(7) #define RD PDout(4) #define CS PDout(5) #define AMOD PDout(6) #define INT PDout(1) void SetOutPut(uint16_t GPIO_Pin); //IO输出模式 void SetInPut(uint16_t GPIO_Pin); void CH438_Init(void); void CH438WriteReg(u8 add,u8 data); u8 CH438ReadReg(u8 add); unsigned char CH438_CheckIIR(unsigned char num); void CH438_CloseSeril(unsigned char num); void CH438_CloseALLSeril(void); void CH438_ResetSeril(unsigned char num); void CH438_SetBandrate(unsigned char num, unsigned long value); void CH438_UARTInit(unsigned char num); void CH438_SendDatas(unsigned char num, unsigned char* sendbuff,unsigned char len); unsigned char CH438_RecvDatas(unsigned char num, unsigned char* revbuff); void CH438_TranConfig(unsigned char num); void CH438_INTConfig(unsigned char num); void CH438_AutoHFCtrl(unsigned char num); void CH438_RegTEST(unsigned char num); void CH438_Uart_Init(unsigned char num,unsigned long value); #endif 效果图 遇到问题自己多看文档 |
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
598浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 21:56 , Processed in 1.075122 second(s), Total 78, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号