股票

STM8S103串口通信初始化设置

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

感谢极品茶的STM8S 串口初始化设置
声明部分
uart.h

  1. #ifndef __UART_H__
  2. #define __UART_H__
  3. //#include “stm8s.h”
  4. #include “define.h”
  5. //Fcpu=8M时波特率设置
  6. #define UART_RATE_1200 (uint16)6666     //0x1a0a
  7. #define UART_RATE_2400 (uint16)3333     //0xd05
  8. #define UART_RATE_4800 (uint16)1667     //0x683
  9. #define UART_TARE_9600 (uint16)833      //0x341
  10. #define UART_RATE_19200 (uint16)416     //0x1a0
  11. //UART1_SR
  12. #define TXE     (uint8)(1<<7) //发送数据寄存器空
  13. #define TC  (uint8)(1<<6) //发送完成
  14. #define RXNE    (uint8)(1<<5) //读数据寄存器非空
  15. //UART1_CR2
  16. #define TIEN    (1<<7)    //发送中断使能
  17. #define TCIEN   (1<<6)    //发送完成中断使能
  18. #define RIEN    (1<<5)    //接收中断使能
  19. #define TEN     (1<<3)    //发送使能
  20. #define REN     (1<<2)    //接收使能
  21. //UART1_CR3
  22. #define UARTSTOP_1BIT   (0<<4)
  23. #define UARTSTOP_2BIT   (2<<4)
  24. #define UARTSTOP_15BIT  (3<<5)
  25. extern void uart1_init(uint16 tcon);
  26. extern void uart1_send_byte(uint8 byte);
  27. extern uint8 uart1_rece_byte(uint8 *a);
  28. extern void uart1_send_string(uint8 *a, uint8 datlong);
  29. #endif

函数部分

uart.c

  1. /*
  2. *   – usart.c
  3. */
  4. #include “uart.h”
  5. //****************************
  6. //函数名称:uart1_init
  7. //函数功能:串口寄存器初始化
  8. //入口参数:波特率值
  9. //出口参数:无
  10. //返 回 值:无
  11. //****************************
  12. void uart1_init(uint16 tcon)
  13. {
  14.     uint8 Temp1 = 0;
  15.     uint8 Temp2 = 0;
  16.     //禁止UART发送和接收
  17.     UART1_CR2 = 0;
  18.     //M=0, 8个数据位; b2=0, 禁止校验; b5=0, UART使能
  19.     UART1_CR1 = 0;
  20.     UART1_CR3 = 0;  //b5 b4=00, 一个停止位
  21.     //设置波特率时注意:
  22.     //1,必须先写BRR2
  23.     //2,BRR1存放的是分频系数的第11位到第4位
  24.     //3,BRR2存放的是分频系数的第15位到第12位,和第3位到第0位
  25.     //对于波特率位9600时,分频系数=8000000/9600=833–>0x341
  26.     Temp1 = (uint8)((tcon>>4)&0x00ff);
  27.     Temp2 = (uint8)((tcon&0x000f)|((tcon>>8)&0x00f0));
  28.     UART1_BRR2 = Temp2;
  29.     UART1_BRR1 = Temp1;
  30.     //允许发送,允许接收,接收中断使能
  31.     UART1_CR2 |= (REN | TEN | RIEN);
  32. }
  33. //****************************
  34. //函数名称:uart1_send_byte
  35. //函数功能:串口发送一字节数据
  36. //入口参数:要发送的数据
  37. //出口参数:无
  38. //返 回 值:无
  39. //****************************
  40. void uart1_send_byte(uint8 byte)
  41. {
  42.     while(!(UART1_SR&TXE))
  43.         ;   //发送数据寄存器为非空,等待
  44.     UART1_DR = byte;
  45. }
  46. //*****************************
  47. //函数名称:uart1_rece_byte
  48. //函数功能:串口接收一字节数据
  49. //入口参数:无
  50. //出口参数:接收到的数据
  51. //返 回 值:返回是否接收到数据,接收到数据返回1,未接收到返回0
  52. //*****************************
  53. uint8 uart1_rece_byte(uint8 *a)
  54. {
  55.     if((UART1_SR&RXNE) != 0)    //读数据寄存器为非空,说明有数据进来
  56.     {
  57.         UART1_SR &= ~RXNE;
  58.         *a = UART1_DR;
  59.         return 1;
  60.     }
  61.     return 0;
  62. }
  63. //****************************
  64. //函数名称:uart_send_string
  65. //函数功能:串口发送一串数据
  66. //入口参数:要发送的数据
  67. //出口参数:无
  68. //返 回 值:无
  69. //****************************
  70. void uart1_send_string(uint8 *a, uint8 datlong)
  71. {
  72.     uint8 i=0;
  73.     for(i=0; i<datlong; i++)
  74.     {
  75.         while(!(UART1_SR&TXE))
  76.             ;//发送数据寄存器为非空,等待
  77.         UART1_DR = a[i];
  78.     }
  79. }

主函数调用

main.c

  1. main()
  2. {
  3.     //PD_DDR |= (1<<2);
  4.     //PD_CR1 |= (1<<2);
  5.     //PD_CR2 &= ~(1<<2);//PD2设置为推挽输出
  6.     PD_DDR |= (1<<5);
  7.     PD_CR1 |= (1<<5);
  8.     PD_CR2 &= (1<<5); //PD5设置为推挽输出
  9.     PD_DDR &= (1<<6); //PD6设置为悬浮输入
  10.     //PD_ODR |= (1<<2);
  11.     //clk_init();
  12.     _asm(“rim”);    //开中断
  13.     //timer1_pwm_init();
  14.     uart1_init(UART_TARE_9600);
  15.     //timer2_pwm_init();
  16.     while (1);
  17. }

中断函数部分

stm8_interrupt_vector.c

 
  1. /*  BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
  2.  *  Copyright (c) 2007 STMicroelectronics
  3.  */
  4. #include “uart.h”
  5. typedef void @far (*interrupt_handler_t)(void);
  6. struct interrupt_vector {
  7.     unsigned char interrupt_instruction;
  8.     interrupt_handler_t interrupt_handler;
  9. };
  10. @far @interrupt void UART1_RX_IRQHandler (void)
  11. {
  12.     /* in order to detect unexpected events during development,
  13.        it is recommended to set a breakpoint on the following instruction
  14.     */
  15.     uint8 *a;
  16.     uart1_rece_byte(a);
  17.     *a += 1;
  18.     uart1_send_byte(*a);
  19.     return;
  20. }
  21. @far @interrupt void UART1_TX_IRQHandler (void)
  22. {
  23.     return;
  24. }
  25. @far @interrupt void NonHandledInterrupt (void)
  26. {
  27.     return;
  28. }
  29. extern void _stext();     /* startup routine */
  30. struct interrupt_vector const _vectab[] = {
  31.     {0x82, (interrupt_handler_t)_stext}, /* reset */
  32.     {0x82, NonHandledInterrupt}, /* trap  */
  33.     {0x82, NonHandledInterrupt}, /* irq0  */
  34.     {0x82, NonHandledInterrupt}, /* irq1  */
  35.     {0x82, NonHandledInterrupt}, /* irq2  */
  36.     {0x82, NonHandledInterrupt}, /* irq3  */
  37.     {0x82, NonHandledInterrupt}, /* irq4  */
  38.     {0x82, NonHandledInterrupt}, /* irq5  */
  39.     {0x82, NonHandledInterrupt}, /* irq6  */
  40.     {0x82, NonHandledInterrupt}, /* irq7  */
  41.     {0x82, NonHandledInterrupt}, /* irq8  */
  42.     {0x82, NonHandledInterrupt}, /* irq9  */
  43.     {0x82, NonHandledInterrupt}, /* irq10 */
  44.     {0x82, NonHandledInterrupt}, /* irq11 */
  45.     {0x82, NonHandledInterrupt}, /* irq12 */
  46.     {0x82, NonHandledInterrupt}, /* irq13 */
  47.     {0x82, NonHandledInterrupt}, /* irq14 */
  48.     {0x82, NonHandledInterrupt}, /* irq15 */
  49.     {0x82, NonHandledInterrupt}, /* irq16 */
  50.     {0x82, UART1_TX_IRQHandler}, /* irq17 */
  51.     {0x82, UART1_RX_IRQHandler}, /* irq18 */
  52.     {0x82, NonHandledInterrupt}, /* irq19 */
  53.     {0x82, NonHandledInterrupt}, /* irq20 */
  54.     {0x82, NonHandledInterrupt}, /* irq21 */
  55.     {0x82, NonHandledInterrupt}, /* irq22 */
  56.     {0x82, NonHandledInterrupt}, /* irq23 */
  57.     {0x82, NonHandledInterrupt}, /* irq24 */
  58.     {0x82, NonHandledInterrupt}, /* irq25 */
  59.     {0x82, NonHandledInterrupt}, /* irq26 */
  60.     {0x82, NonHandledInterrupt}, /* irq27 */
  61.     {0x82, NonHandledInterrupt}, /* irq28 */
  62.     {0x82, NonHandledInterrupt}, /* irq29 */
  63. };

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

打赏
原文链接:,转发请注明来源!

发表评论