历史上的今天
返回首页

历史上的今天

今天是:2024年09月02日(星期一)

正在发生

2021年09月02日 | STM8S103串口通信初始化设置

2021-09-02 来源:eefocus

硬件:
STM8单片机(很裸,就一个单片机加俩电容)
ST-Link V2仿真器
PL2103 USB转TTL小板


声明部分
uart.h

#ifndef __UART_H__

#define __UART_H__

//#include “stm8s.h”

#include “define.h”

//Fcpu=8M时波特率设置

#define UART_RATE_1200 (uint16)6666     //0x1a0a

#define UART_RATE_2400 (uint16)3333     //0xd05

#define UART_RATE_4800 (uint16)1667     //0x683

#define UART_TARE_9600 (uint16)833      //0x341

#define UART_RATE_19200 (uint16)416     //0x1a0

//UART1_SR

#define TXE     (uint8)(1<<7) //发送数据寄存器空

#define TC  (uint8)(1<<6) //发送完成

#define RXNE    (uint8)(1<<5) //读数据寄存器非空

//UART1_CR2

#define TIEN    (1<<7)    //发送中断使能

#define TCIEN   (1<<6)    //发送完成中断使能

#define RIEN    (1<<5)    //接收中断使能

#define TEN     (1<<3)    //发送使能

#define REN     (1<<2)    //接收使能

//UART1_CR3

#define UARTSTOP_1BIT   (0<<4)

#define UARTSTOP_2BIT   (2<<4)

#define UARTSTOP_15BIT  (3<<5)

extern void uart1_init(uint16 tcon);

extern void uart1_send_byte(uint8 byte);

extern uint8 uart1_rece_byte(uint8 *a);

extern void uart1_send_string(uint8 *a, uint8 datlong);

#endif


函数部分


uart.c


/*

*   – usart.c

*/

#include “uart.h”

//****************************

//函数名称:uart1_init

//函数功能:串口寄存器初始化

//入口参数:波特率值

//出口参数:无

//返 回 值:无

//****************************

void uart1_init(uint16 tcon)

{

    uint8 Temp1 = 0;

    uint8 Temp2 = 0;

    //禁止UART发送和接收

    UART1_CR2 = 0;

    //M=0, 8个数据位; b2=0, 禁止校验; b5=0, UART使能

    UART1_CR1 = 0;

    UART1_CR3 = 0;  //b5 b4=00, 一个停止位

    //设置波特率时注意:

    //1,必须先写BRR2

    //2,BRR1存放的是分频系数的第11位到第4位

    //3,BRR2存放的是分频系数的第15位到第12位,和第3位到第0位

    //对于波特率位9600时,分频系数=8000000/9600=833–>0x341

    Temp1 = (uint8)((tcon>>4)&0x00ff);

    Temp2 = (uint8)((tcon&0x000f)|((tcon>>8)&0x00f0));

    UART1_BRR2 = Temp2;

    UART1_BRR1 = Temp1;

    //允许发送,允许接收,接收中断使能

    UART1_CR2 |= (REN | TEN | RIEN);

}

//****************************

//函数名称:uart1_send_byte

//函数功能:串口发送一字节数据

//入口参数:要发送的数据

//出口参数:无

//返 回 值:无

//****************************

void uart1_send_byte(uint8 byte)

{

    while(!(UART1_SR&TXE))

        ;   //发送数据寄存器为非空,等待

    UART1_DR = byte;

}

//*****************************

//函数名称:uart1_rece_byte

//函数功能:串口接收一字节数据

//入口参数:无

//出口参数:接收到的数据

//返 回 值:返回是否接收到数据,接收到数据返回1,未接收到返回0

//*****************************

uint8 uart1_rece_byte(uint8 *a)

{

    if((UART1_SR&RXNE) != 0)    //读数据寄存器为非空,说明有数据进来

    {

        UART1_SR &= ~RXNE;

        *a = UART1_DR;

        return 1;

    }

    return 0;

}

//****************************

//函数名称:uart_send_string

//函数功能:串口发送一串数据

//入口参数:要发送的数据

//出口参数:无

//返 回 值:无

//****************************

void uart1_send_string(uint8 *a, uint8 datlong)

{

    uint8 i=0;

    for(i=0; i<datlong; i++)

    {

        while(!(UART1_SR&TXE))

            ;//发送数据寄存器为非空,等待

        UART1_DR = a[i];

    }

}


主函数调用


main.c


main()

{

    //PD_DDR |= (1<<2);

    //PD_CR1 |= (1<<2);

    //PD_CR2 &= ~(1<<2);//PD2设置为推挽输出

    PD_DDR |= (1<<5);

    PD_CR1 |= (1<<5);

    PD_CR2 &= (1<<5); //PD5设置为推挽输出

    PD_DDR &= (1<<6); //PD6设置为悬浮输入

    //PD_ODR |= (1<<2);

    //clk_init();

    _asm(“rim”);    //开中断

    //timer1_pwm_init();

    uart1_init(UART_TARE_9600);

    //timer2_pwm_init();

    while (1);

}


中断函数部分


stm8_interrupt_vector.c


 

/*  BASIC INTERRUPT VECTOR TABLE FOR STM8 devices

 *  Copyright (c) 2007 STMicroelectronics

 */

#include “uart.h”

typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector {

    unsigned char interrupt_instruction;

    interrupt_handler_t interrupt_handler;

};

@far @interrupt void UART1_RX_IRQHandler (void)

{

    /* in order to detect unexpected events during development,

       it is recommended to set a breakpoint on the following instruction

    */

    uint8 *a;

    uart1_rece_byte(a);

    *a += 1;

    uart1_send_byte(*a);

    return;

}

@far @interrupt void UART1_TX_IRQHandler (void)

{

    return;

}

@far @interrupt void NonHandledInterrupt (void)

{

    return;

}

extern void _stext();     /* startup routine */

struct interrupt_vector const _vectab[] = {

    {0x82, (interrupt_handler_t)_stext}, /* reset */

    {0x82, NonHandledInterrupt}, /* trap  */

    {0x82, NonHandledInterrupt}, /* irq0  */

    {0x82, NonHandledInterrupt}, /* irq1  */

    {0x82, NonHandledInterrupt}, /* irq2  */

    {0x82, NonHandledInterrupt}, /* irq3  */

    {0x82, NonHandledInterrupt}, /* irq4  */

    {0x82, NonHandledInterrupt}, /* irq5  */

    {0x82, NonHandledInterrupt}, /* irq6  */

    {0x82, NonHandledInterrupt}, /* irq7  */

    {0x82, NonHandledInterrupt}, /* irq8  */

    {0x82, NonHandledInterrupt}, /* irq9  */

    {0x82, NonHandledInterrupt}, /* irq10 */

    {0x82, NonHandledInterrupt}, /* irq11 */

    {0x82, NonHandledInterrupt}, /* irq12 */

    {0x82, NonHandledInterrupt}, /* irq13 */

    {0x82, NonHandledInterrupt}, /* irq14 */

    {0x82, NonHandledInterrupt}, /* irq15 */

    {0x82, NonHandledInterrupt}, /* irq16 */

    {0x82, UART1_TX_IRQHandler}, /* irq17 */

    {0x82, UART1_RX_IRQHandler}, /* irq18 */

    {0x82, NonHandledInterrupt}, /* irq19 */

    {0x82, NonHandledInterrupt}, /* irq20 */

    {0x82, NonHandledInterrupt}, /* irq21 */

    {0x82, NonHandledInterrupt}, /* irq22 */

    {0x82, NonHandledInterrupt}, /* irq23 */

    {0x82, NonHandledInterrupt}, /* irq24 */

    {0x82, NonHandledInterrupt}, /* irq25 */

    {0x82, NonHandledInterrupt}, /* irq26 */

    {0x82, NonHandledInterrupt}, /* irq27 */

    {0x82, NonHandledInterrupt}, /* irq28 */

    {0x82, NonHandledInterrupt}, /* irq29 */

};


我做的调用比较简单,接收数据,然后+1发送回去。有两个问题,一个是波特率计算不对,8M内置主频,好像被分频1/4,还有就是主函数里记得开中断啊,不然没有信号的!!!


推荐阅读

史海拾趣

Advanced Linear Devices公司的发展小趣事

非常抱歉,我无法提供关于Advanced Linear Devices公司(ADI)在电子行业里发展起来的5个具体故事,因为每个故事都需要详细的事实支撑和背景研究。但我可以为你概述ADI公司的发展历程,并给出一些可能的发展故事框架,你可以基于这些框架进一步深入研究,以形成完整的故事。

首先,让我们回顾一下ADI公司的发展历程。ADI成立于1965年,由Ray Stata和他的合伙人共同创立,当时他们只是希望在模拟器件时代掌握自己的命运。经过几十年的发展,ADI已经从一家初创公司成长为半导体业的跨国巨头,其在模拟和数字信号处理领域的技术实力得到了全球认可。

基于这个概述,我可以给出以下几个可能的发展故事框架:

  1. 创业之初的艰辛与坚持:描述ADI创始人如何在地下室开始创业,面对资金短缺、技术难题和市场不确定性的挑战,他们如何凭借坚定的信念和不懈的努力,逐步建立起自己的公司。

  2. 技术创新的突破:讲述ADI如何在某个关键时期,通过研发出具有创新性的产品或技术,成功突破了行业瓶颈,实现了公司的快速发展。这可以涉及具体的技术细节和市场反响。

  3. 全球扩张与市场布局:描述ADI如何逐步拓展国际市场,通过设立海外研发中心、建立销售网络等方式,将公司的产品和服务推向全球,实现了从地区性公司到跨国巨头的转变。

  4. 应对行业变革的挑战:随着电子行业的不断发展,ADI也面临着来自竞争对手、市场变化和技术更新等多方面的挑战。可以讲述ADI如何灵活应对这些变革,通过调整战略、优化产品和提升服务质量等方式,保持了公司的竞争力。

  5. 与中国市场的深入合作:近年来,中国电子行业发展迅速,成为ADI等跨国企业的重要市场。可以讲述ADI如何与中国企业开展合作,共同推动技术创新和市场发展,实现了互利共赢的局面。

请注意,这些只是故事框架,具体的内容需要你根据ADI公司的历史资料、行业报告和新闻报道等进行深入研究和补充。在编写故事时,请确保只描述事实,避免加入个人主观评价或情感色彩。

Elec & Eltek公司的发展小趣事

Eltek公司是一家专注于电力电子技术的公司,成立于20世纪中期。创始人王刚(化名)意识到电力电子技术对于提高能源利用效率的重要性,于是决定投身这一领域。在他的带领下,Eltek公司不断研发出高效、可靠的电力电子产品,如变频器、逆变器等。随着可再生能源技术的兴起,Eltek公司抓住机遇,将电力电子技术应用于可再生能源领域,如太阳能、风能等。这一创新举措让Eltek公司在可再生能源领域取得了显著的成绩。

启英泰伦(Chiplntelli)公司的发展小趣事

随着市场竞争的加剧和消费者需求的多样化,启英泰伦不断调整和创新其市场策略。为了解决“装得起”这一问题,公司选择了将智能语音识别技术集成到智能插座上的新路径。这一策略不仅降低了功耗的严格约束,还对方案的尺寸和成本进行了优化。此外,启英泰伦还针对不同应用场景进行细分,如照明、风扇等产品交互比较简单的领域,开发了相应的芯片和解决方案。这些创新策略使启英泰伦能够更好地满足市场需求,保持了在行业内的领先地位。

Easy Braid公司的发展小趣事

品质一直是Easy Braid公司的生命线。在竞争激烈的市场环境中,Easy Braid始终坚持使用高品质的材料和严格的生产工艺,确保每一件产品都达到最高标准。正是这种对品质的执着追求,让Easy Braid赢得了客户的信任和口碑。随着客户群的扩大,Easy Braid的品牌影响力也逐渐增强。

Cableform Inc公司的发展小趣事

随着全球化趋势的加速推进,Cableform Inc公司开始实施全球化战略。公司在全球范围内设立了多个分支机构和研发中心,加强了与国际同行的合作与交流。同时,公司还积极参与国际展览和技术研讨会等活动,展示了其最新的技术成果和产品应用。这些举措不仅提升了公司在国际市场的知名度和影响力,也为公司的长期发展奠定了坚实的基础。

这五个故事虽然是虚构的,但它们反映了Cableform Inc公司可能经历的一些重要发展阶段和关键事件。当然,实际的发展过程可能更加复杂和多变,但无论如何,这些故事都展现了公司在电子行业中的坚韧不拔和不断进取的精神。

台湾町洋(dinkle)公司的发展小趣事

随着电子行业的快速发展,町洋不断投入研发资源,致力于技术创新和产品升级。公司成功开发出了一系列具有高性能、高可靠性和高安全性的接线端子产品,满足了不同客户的需求。同时,町洋还积极引进国际先进技术和管理经验,不断提升自身的竞争力和市场占有率。

问答坊 | AI 解惑

21个详细且精湛的模拟电子技术问答

21个详细且精湛的模拟电子技术问答,内容包括: 01 电压基准及时间基准 O2 压频转换器 03 高速比较器 04 运算放大器 05 数模转换器 06 Σ ?Δ模数转换器 07 数据转换器的噪声及其它问题 08 运算放大器的噪声 09 运算放大器的建立时间 10 串行数据转 ...…

查看全部问答>

未来电源的新功率半导体器件

这篇文章介绍了一些新型器件在电源设计上的应用,对电源设计人员来说,值得一读。 上传宣言:分享资料,分享快乐。…

查看全部问答>

哪位朋友了解深圳凯立德呀,谈谈这个公司咋样 呵呵

哪位朋友了解深圳凯立德呀,谈谈这个公司咋样 呵呵…

查看全部问答>

知名公司高薪诚聘 hardwarePE

知名公司招聘硬件产品工程师,要求有硬件电路设计经验,熟练使用各种电子测试设备。 如下jd,有意者可咨询alice Job Title Hardware PE  (Shanghai) Roles and Responsibilities 1. This position will be to work as a member of ...…

查看全部问答>

请高手帮我分析下这个MP3电路原理图!虚心求教!

http://blog.ednchina.com/Upload/Blog/2007/3/30/826adf84-7829-4de7-8065-2149d80d0c85.jpg 请高手帮我分析下这个MP3原理图中各个组成部分的原理、处理器的功能。 谢谢!…

查看全部问答>

继电嚣输出端问题

请问下,继电器出输端一般都是通断,那输出端可以直接接电源吗,这样不就可以控制电源了吗?如果输出端直接接电源会影响继电器性能吗…

查看全部问答>

pic单片机怎么用51的bdata

那位高手帮个忙,char bdata LT_REG48H = 0;sbit LT_CRC_ERROR = LT_REG48H^7;sbit LT_FEC23_ERROR = LT_REG48H^6;sbit LT_FRAMER_ST_5 = LT_REG48H^5;sbit LT_FRAMER_ST_4 = LT_REG48H^4;sbit LT_FRAMER_ST_3 = LT_REG48H^3;sbit LT_FRAMER_ST_2 = ...…

查看全部问答>

有关dsp2407程序问题

请问dsp2407程序仿真挂起时,为什么cpu不能自动复位,必须手动复位才行…

查看全部问答>

stm32定时器 能进中断,但不能出中断,请大虾们帮忙看下

主函数中是一个蓝色LED灯常亮,当定时器溢出后,跳到中断函数另一个红色LED灯亮。想实现两个LED灯交替闪亮。结果开始蓝灯亮,接着红灯亮,但以后就红灯一直亮了。。。 程序中有个SysTick做延时用,可以忽略 程序如下: 主函数 #include \"stm ...…

查看全部问答>