历史上的今天
返回首页

历史上的今天

今天是:2025年03月23日(星期日)

正在发生

2020年03月23日 | STM8 普通IO配置模拟串口输出

2020-03-23 来源:eefocus

刚接到上级的需求,由于stm8的串口资源较少,需要在原来工程的基础上加多一个io来输出串口数据。串口在每个学习单片机的人来说都是耳熟能详的东西。没有串口基础的同学建议先去学习串口知识点再来阅读。


首先我们知道串口数据配置里面包含:波特率、流控、数据起始位、数据位、奇偶校验位、停止位。针对本人经常选的配置为:

image.png?imageView2/2/w/550

数据起始位默认都是1。数据实体如下:

由于本人选用波特率为115200 bps ,通过计算器算出每发送一位需要8.68us。这是一个非常低延时的值,这时候就要考虑写一个高精度的短延时的函数。那么问题来了,现在每次一个语句都是以微秒为单位的,任何写多一个语句和写少一个语句都会影响到这个延时函数,计算起来相当复杂。(去年自己写过高精度延时函数,但是是针对stm8在时钟频率是2mhz,且函数参数单位是1.5us的,但是最小延时只能是21us,无法把延时降到8.68us左右当时写出这个延时函数花费1-2天的时间去测试和验证,测试起来比较繁琐和麻烦)


为了更快更有效的完成这个需求,本人采取扫描方式来找到自己想要的延时时间。前提要先写好io模拟串口驱动,本人在stm8平台上对PD3做串口输出。


普通io模拟串口驱动分别写在了一个c文件和h文件中:


.C:


#include "analog_uart.h"

 

uint16_t ANALOG_TICK_N = 1;// 115200bps:18 ,9600bps:270

 

void analog_uart_init(void) {    //初始化

    GPIO_Init(TXD_PORT, TXD_PIN,GPIO_MODE_OUT_PP_HIGH_FAST);

}

 

inline void bxxx_delay(void) {   //延时值作为波特率需要的延时时间函数

    for(uint16_t i = 0; i < ANALOG_TICK_N ; ++i) {

        asm("nop");

    }

}

 

static inline void TXD_Write(uint8_t i) { //io 输出高或低电平

    if(i == 0) {

        TXD_PORT->ODR &= (uint8_t)(~TXD_PIN);

    } else {

        TXD_PORT->ODR |= (uint8_t)TXD_PIN;

    }

}

 

static void sent_byte(uint8_t byte) { // 模拟串口输出1个字节

    uint8_t i = 8;

    TXD_Write(0);

    bxxx_delay();

    while(i--) {

        TXD_Write((uint8_t)(byte&0x01));

        bxxx_delay();

        byte = byte >> 1;

    }

    TXD_Write(1);

    bxxx_delay();

 

void analog_uart_sent_data(uint8_t * data,uint16_t size) { // 模拟串口输出字符串

    uint16_t i = size;

    while(i--) {

        sent_byte(*data);

        ++data;

        bxxx_delay();

    }

}

 

void print_tick_num(void) {  //打印延时值出来,通过应用端对延时值做递增,在串口助手查找延时值

    uint8_t buf[10] = "N:";

    uitoa(ANALOG_TICK_N,(char *)buf+2);

    analog_uart_sent_data(buf,strlen((char *)buf));

}

 

/***

 * Description : 将无符号整数转为字符串.

 * Arguments   : val     待转换的整数.

 *               str     转换后字符串储存的数组指针.

 * Returns     : 返回转换后的指针.

 * Caller      : Application.

 * Notes       : None.

 *******************************************************************************

 */

static char* uitoa(uint32_t val, char *str)

{

    uint32_t power,j;

    char *p = NULL;

    if (str != NULL)

    {

        p = str;

        j = val;

        for (power = 1; j >= 10; j /= 10)

        {

            power *= 10;

        }

        for (; power > 0; power /= 10)

        {

            *p++ = '0' + val / power;

            val %= power;

        }

        *p = '';

        p = str;

    }

    return p;

}

.H:


#ifndef ANALOG_UART_H

#define ANALOG_UART_H

#include "stm8s.h"

#include

 

#define TXD_PORT  GPIOD

#define TXD_PIN   GPIO_PIN_3

 

extern uint16_t ANALOG_TICK_N ;


void analog_uart_init(void); // 初始化

void bxxx_delay(void);

static void sent_byte(uint8_t byte) ;

void analog_uart_sent_data(uint8_t * data,uint16_t size);  //发送串口数据

static char* uitoa(uint32_t val, char *str);

void print_tick_num(void) ;    // 查看延时时间数

 

#endif

在主函数完成相关操作


#include .....

#include "analog_uart.h"

 

..

 

 

void main(void) {

    /*相关初始化*/

    .....

    analog_uart_init();

    .....

    while(1) {

        print_tick_num();

        analog_uart_sent_data("fangrn",6);

        delay_ms(10);

        ANALOG_TICK_N ++;

    }

 

}


测试结果如下图:

发现,当N等于16或17时,数据是比较稳定,而N等于18的时候数据已经有部分丢失。此时stm8选择LSI内部时钟16Mhz的,当时测试的时候用的是LSI内部时钟4Mhz,结果没找到自己想要的延时。于是选择使用16MhzLSI,就找到延时值为16或17是存在于115200bps中。随着n不断增加,波特率就越低,最后会到一个无法打印出数据的时候。证明已经找不到自己想要的延时时间了。其实这种情况是不容乐观,因为LSI时钟其实并不稳定,单独测试的没问题,把它注入到较大的应用程序常常会部分乱码,因此建议降低波特率做开发,本人最后选择降低到9600bps进行扫描,9600bps算出来约104us。接下来对9600进行扫描


[2019-08-28_21:19:57:972] .:253&angj)aze

[2019-08-28_21:19:58:088] .:254&angj)aze

[2019-08-28_21:19:58:212] .:255fang猧aze? N:25秄ang猧aze? N:257fang?iaze

[2019-08-28_21:19:58:570] N:25竑angjiaze

[2019-08-28_21:19:58:691] N:259fangjiaz?

[2019-08-28_21:19:58:810] N:260fangjiaze

[2019-08-28_21:19:58:931] N:261fangjiaze

[2019-08-28_21:19:59:050] N:262fangjiaze

[2019-08-28_21:19:59:173] N:263fangjiaze

[2019-08-28_21:19:59:294] N:264fangjiaze

[2019-08-28_21:19:59:415] N:265fangjiaze

[2019-08-28_21:19:59:534] N:266fangjiaze

[2019-08-28_21:19:59:655] N:267fangjiaze

[2019-08-28_21:19:59:776] N:268fangjiaze

[2019-08-28_21:19:59:899] N:269fangjiaze

[2019-08-28_21:20:00:019] N:270fangjiaze

[2019-08-28_21:20:00:140] N:271fangjiaze

[2019-08-28_21:20:00:262] N:272fangjiaze

[2019-08-28_21:20:00:384] N:273fangjiaze

[2019-08-28_21:20:00:503] N:274fangjiaze

[2019-08-28_21:20:00:625] N:275fangjiaze

[2019-08-28_21:20:00:747] N:276fangjiaze

[2019-08-28_21:20:00:871] N:277fangjiaze

[2019-08-28_21:20:00:993] N:278fangjiaze

[2019-08-28_21:20:01:114] N:279fangjiaze

[2019-08-28_21:20:01:237] N:280fangjiaze

[2019-08-28_21:20:01:359] N:281fangjiaze

[2019-08-28_21:20:01:480] N:282fangj?aze

[2019-08-28_21:20:01:603] ?:283f?n?jiaz?

[2019-08-28_21:20:01:726] ?z284f??鏹i狷e

当扫描到257时,数据逐渐稳定,此时是比较乐观的,可以看到不少数据是稳定正确,这个时候选择中间值就是最稳定的。因此本人选择270这个值来延时作为串口波特率9600输出数据,这样加入到应用程序中就比较稳定了。

推荐阅读

史海拾趣

Gamma Microelectronics ( APM )公司的发展小趣事

为了提高DSSC的转换效率和长期稳定性,G24i积极寻求技术合作。公司与离子液体供应商BASF公司签署了合作协议,共同开发性能更优的离子液体和电解液配方。此外,G24i还与国内外多家科研机构建立了紧密的合作关系,共同推进DSSC技术的研发和创新。这些合作不仅为G24i带来了先进的技术支持,也促进了整个DSSC行业的快速发展。

Ferranti Electric Inc公司的发展小趣事

Ferranti Electric Inc公司非常重视知识产权的保护和积累。通过不断的技术研发和创新,公司积累了大量的知识产权,包括商标、专利等。这些知识产权的拥有不仅彰显了公司的技术实力和创新能力,也为公司的市场竞争提供了有力的保障。公司不断加大在研发和创新方面的投入,以保持其在电气行业的领先地位。

Fronter Electronics Co Ltd公司的发展小趣事

进入21世纪后,Fronter电子意识到技术创新的重要性,开始加大在技术研发方面的投入。公司成立了专门的研发团队,致力于IC模块、晶振、滤波器、电感等电子产品的技术开发与升级。同时,Fronter电子积极申请专利,保护自主知识产权,并逐步打造出了自己的品牌“FT”。随着技术实力的增强和品牌知名度的提升,Fronter电子在电子行业中的影响力进一步扩大。

Chauvin Arnoux公司的发展小趣事

在1905年,Chauvin Arnoux公司推出了带有曲柄电感的欧姆表,这一创新为电气测量领域带来了突破性的进展。随后,在1923年,公司进一步发展了这一技术,使得欧姆表的测量不再受到曲柄速度的影响,大大提高了测量的准确性和稳定性。这一系列的创新使得Chauvin Arnoux在电气测量领域确立了领先地位,为后续的发展奠定了坚实的基础。

BITECH公司的发展小趣事

1934年,Chauvin Arnoux再次引领技术潮流,发明了电流互感器钳形表,这是世界上第一个非接触式电流表。这一发明不仅改变了电流测量的传统方式,而且极大地提高了测量的便捷性和安全性。非接触式电流表的出现,为电气工程师和技术人员提供了更为高效和安全的测量工具,推动了电气行业的发展。

Daburn公司的发展小趣事

Daburn公司自创立之初就致力于电子连接器的研发。在上世纪80年代,公司推出了一款新型的高性能连接器,该连接器采用了独特的材料和设计,大大提高了数据传输的效率和稳定性。这一技术突破让Daburn在行业中崭露头角,并吸引了大量客户的关注。随着技术的不断进步,Daburn逐渐扩展了其产品线,涵盖了线束、电缆组件和定制连接解决方案等多个领域。

问答坊 | AI 解惑

一种带辅助变压器的Flyback变换器ZVS软开关实现方案

摘要:提出了一种新颖的 FLYBACK 变换器ZVS软开关实现方案。 一个较小的辅助变压器与主 变压器串联,通过使辅助变压器原边激磁电感电流双向来达到主开关管的ZVS软开关条件。该方 案实现了主辅开关管的 ZVS软开关,限制了输出整流二极管关断时的 d ...…

查看全部问答>

急急急!有关串口问题!

我用串口线把两台电脑连接,由于串口线两头是一公一母的, 所以串口线的一端用串口转换接头做了转换. (这个接头是我们公司另一个部门做的). 现在的问题是通过串口调试助手发现 串口通信时数据的接收总是单向的. 不知道是那个转换接头的问题还是 ...…

查看全部问答>

LED芯片制造设备现状及其工艺介绍

replyreload += \',\' + 770973;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

求助,谁有STM32GC102CB的资料

                                 谁有STM32GC102CB的资料,我想看看这款芯片的资料,那位有,感激不尽啊。…

查看全部问答>

430的熔丝太难烧断了,求助。

最近在diy一个熔断器,我已经按照时序和6.5V的电压加在tdi上,可就是熔不断。从tdi发指令0xaaaa,TDO返回的始终是0x5555.未熔断状态。所有的操作和时序严格按ti的手册上来的,已经可以和目标430通讯,有返回码,熔断电压是6.5v,也正确,不知为何烧 ...…

查看全部问答>

帮忙看一下代码

//                   /|\\  /|\\//               MSP430F261x/241x 10k  10k     //             &n ...…

查看全部问答>

ADI活动样片申请第一次!

ADI申请样片一次申请4种,现在升级了好象是说可以申请8种 第一次申请经过十几天的等待终于寄到4种!还要等待14天后才可以再次申请!由于器件封装问题,还要想办法! [ 本帖最后由 蓝雨夜 于 2012-11-12 14:26 编辑 ]…

查看全部问答>

关于RTL8019AS发送数据包时寄存器设置问题

想问一下,用rtl8019as发送数据包时,怎么设置RBCR,TBCR寄存器的值?即怎么判断发送的数据包的大小?…

查看全部问答>

UAF42通用有源滤波器软件

请问有没有大神会用UAF42的软件设计滤波电路…

查看全部问答>

msp430 矩阵按键 +LED显示

矩阵按键连接P2口 LED灯P1口,但是程序有问题,按键没反应,然后L2 L3 L4 灯不亮,其余都亮,在线等 #include #define uchar unsigned char #define uint unsigned int #define CLR_Led1 P1OUT&=~BIT4; #define SET_Led1 P1OUT|=BIT4; #defi ...…

查看全部问答>