紧急求助关于stm8 uart1通讯问题

查看: 1447|回复: 3
STM8S103F2串口通信问题
主题帖子精华
中级会员, 积分 309, 距离下一级还需 191 积分
在线时间0 小时
采用的是内部时钟 ,, 贴出具体的代码如下:
[C] 纯文本查看 复制代码void main(void)
/* Infinite loop */
//CLK_AdjustHSICalibrationValue(CLK_HSITRIMVALUE_0);
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
initUart();
//串口初始化
enableInterrupts();
[C] 纯文本查看 复制代码void
initUart(){
CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);
//使能UART时钟
GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);
UART1_DeInit();
UART1_Init((u32)2400, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, //9600 8bit
允许输入输出
UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_Cmd(ENABLE); //启动UART
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
//使能接收终端
错误结果截图如下:
c961beaf53a1bc0e.png (0 Bytes, 下载次数: 0)
22:54 上传
bf14ea55dab4b4e34fa2_0.png (0 Bytes, 下载次数: 0)
22:54 上传
电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...
主题帖子精华
高级会员, 积分 907, 距离下一级还需 93 积分
在线时间24 小时
用的库啊,我这只有寄存器版程序,用的IAR还是STVD,那个环境更适合用库呢
把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。
应用确实不容易,水平是在不断的实践中完善和发展的。
主题帖子精华
中级会员, 积分 309, 距离下一级还需 191 积分
在线时间0 小时
回复【2楼】爱博不专:
---------------------------------
用的IAR
电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...
主题帖子精华
在线时间8 小时
帮顶。。。。
站在巨人的肩膀上不断的前进。。。
Powered by请教香主,STM8S103 UART1校验位的问题?==
热门型号:
&&&当前位置:
请教香主,STM8S103 UART1校验位的问题?
用户名:Xflyan
注册时间: 13:37:00
请教香主,STM8S103 UART1校验位的问题?
本帖最后由 Xflyan 于
13:38 编辑 最近在STM8S103上调MODBUS RTU,MODBUS的Serial通信字符帧长度为11bit,即无校验(NONE) + STOP_BIT_2 或 奇校验(ODD) + STOP_BIT_1 或 偶校验(EVEN) + STOP_BIT_1;但一个奇怪的问题就是,只要103的字符帧长度为11bit,前面的3选1,PC端不管用哪种方式发送(ODD/EVEN/MARK/SPACE + 1),103居然都能够正确接收并返回,为此我还特意测了一下我PC端的发送序列,奇校验和偶校验时明显是不一样的,103这个情况似乎太强悍了,能解释下吗?为什么没有103没有提示校验错误?UART1配置为 测试波特率为9600:void halUARTInit(u8 baudrate, u8 parity){
(parity) {
case UART_PARITY_NONE:
UART1->CR3 = 0x20; // STOP_BIT_2
case UART_PARITY_EVEN:
UART1->CR1 = UART1_CR1_PCEN | UART1_CR1_M;
case UART_PARITY_ODD:
UART1->CR1 = UART1_CR1_PCEN | UART1_CR1_PS | UART1_CR1_M;
UART1->CR1 = UART1_CR1_PCEN | UART1_CR1_M;
switch (baudrate) {
case UART_BR_115200:
UART1->BRR2 = 0x0B; // 12MHz 115200:BRR=0x0068;
UART1->BRR1 = 0x08; // 16MHz 115200:BRR=0x008B
case UART_BR_57600:
UART1->BRR2 = 0x06; // 12MHz 57600:BRR=0x00D0;
UART1->BRR1 = 0x11; // 16MHz 57600:BRR=0x0116
case UART_BR_38400:
UART1->BRR2 = 0x01; // 12MHz 38400:BRR=0x0139;
UART1->BRR1 = 0x1A; // 16MHz 38400:BRR=0x01A1
case UART_BR_19200:
UART1->BRR2 = 0x01; // 12MHz 19200:BRR=0x0271;
UART1->BRR1 = 0x34; // 16MHz 19200:BRR=0x0341
case UART_BR_9600:
UART1->BRR2 = 0x03; // 12MHz 9600:BRR=0x04E2;
UART1->BRR1 = 0x68; // 16MHz 9600:BRR=0x0683
UART1->CR2 |= UART1_CR2_TEN | UART1_CR2_REN;
UART1->CR2 |= UART1_CR2_RIEN; // RX Interrupt Enable}
用户名:香水城
注册时间: 15:58:00
LZ是如何判断103没有提示校验错误的?
用户名:Xflyan
注册时间: 16:27:00
本帖最后由 Xflyan 于
16:33 编辑
回香主,我是在DEBUG下看接收字符后的UART1-&SR,里面的PE位为0
主要奇怪的是既然开启了校验位,在校验方式不一样的时候应该不能正常通信的,但是不管上位机用哪种校验方式,都能够与103正常通信,之前我没有细看DS,没有置位UART1_CR1_M的时候只能在无校验+2Stopbits下正常通信,其它情况下返回错误数据,后来注意到UART1_CR1_M跟传送的数据位有关,然后加上去了,结果就成这样了
用户名:Xflyan
注册时间: 16:40:00
本帖最后由 Xflyan 于
16:46 编辑
switch (parity) {
case UART_PARITY_NONE:
& & & & UART1-&CR3 = 0x20;
case UART_PARITY_EVEN:
& & & & UART1-&CR1 = UART1_CR1_PCEN;// | UART1_CR1_M;
case UART_PARITY_ODD:
& & & & UART1-&CR1 = UART1_CR1_PCEN | UART1_CR1_PS;// | UART1_CR1_M;
& & & & UART1-&CR1 = UART1_CR1_PCEN;// | UART1_CR1_M;
103选择奇校验ODD,在不置位M位的时候,上位机发送下来的数据也正常接收,但是返回时出错了
发送命令为READ_HOLDING_REGS:01 03 00 00 00 01 84 0A
返回值为:01 83 02 92 34 B3 04
正常返回值应为:01 03 02 12 34 33 04
用户名:香水城
注册时间: 16:50:00
你应该在程序中检查UART1-&SR的PE位,在调试窗口看的时候,标志位很可能已经被其他事件清除了。
用户名:Xflyan
注册时间: 18:18:00
嗯,还是之前不够仔细,PE和OR事件发生了,但在被我读DR时清除掉了!!现在好了,读DR前先判断SR里面是否置位了PE,是则认为错误!在11bit的情况下传输,后两位是校验和停止位,如果不加帧错误判断,对数据部分的传输是无影响的!今天又学到了一点...
热门型号:

我要回帖

更多关于 stm8s uart 的文章

 

随机推荐