你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 5280|回复: 1

【ST公益分享】STM8 -- UART

[复制链接]

10

主题

10

回帖

0

蝴蝶豆

新手上路

最后登录
2019-8-1
发表于 2011-3-23 23:49:37 | 显示全部楼层 |阅读模式
 
串口通讯也是单片机应用中经常要用到,今天的实验就是利用STM8的UART资源,来进行串口通讯的实验。
实验程序的功能是以中断方式接收串口数据,然后将接收到的数据以查询方式发送到串口。程序代码如下,首先要对STM8的UART进行初始化,初始化 时要注意的是波特率寄存器的设置,当求出一个波特率的分频系数(一个16位的数)后,要将高4位和低4位写到BRR2中,而将中间的8位写到BRR1中, 并且必须是先写BRR2,再写BRR1。
同样也是利用ST的开发工具,生成一个C语言的框架,然后修改其中的main.c,同时由于需要用到中断服务,因此还要修改stm8_interrupt_vector.c。
修改后,编译连接,然后下载到开发板上,再做一根与PC机相连的线,把开发板的串口与PC机的串口连接起来,注意,2、3脚要交叉。
在PC机上运行超级终端,设置波特率为9600,然后每按下一个按键,屏幕上就显示对应的字符。
修改后的main.c和stm8_interrupt_vector.c如下:
//  程序描述:初始化UART,以中断方式接收字符,以查询方式发送
//            UART通讯参数:9600bps,8位数据,1位停止位,无校验
 
#include "STM8S207C_S.h"
 
 
// 函数功能:初始化UART
// 输入参数:无
// 输出参数:无
// 返 回 值:无
// 备    注:无
void UART3_Init(void)
{  
 
  LINUART_CR2 = 0;           // 禁止UART发送和接收
  LINUART_CR1 = 0;           // b5 = 0,允许UART
                             // b2 = 0,禁止校验
                                   
  LINUART_CR3 = 0;           // b5,b4 = 00,1个停止位
                           
// 设置波特率,必须注意以下几点:
//    (1) 必须先写BRR2
//    (2) BRR1存放的是分频系数的第11位到第4位,
//    (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位
// 例如对于波特率位9600时,分频系数=2000000/9600=208
// 对应的十六进制数为00D0,BBR1=0D,BBR2=00
  LINUART_BRR2 = 0;
  LINUART_BRR1 = 0x0d;              // 实际的波特率分频系数为00D0(208)
                                                                  // 对应的波特率为2000000/208=9600
                                    
  LINUART_CR2 = 0x2C;               // b3 = 1,允许发送
                                    // b2 = 1,允许接收
                                    // b5 = 1,允许产生接收中断
}
 
// 函数功能:从UART3发送一个字符
// 输入参数:ch -- 要发送的字符
// 输出参数:无
// 返 回 值:无
// 备    注:无
void UART3_SendChar(unsigned char ch)
{
  while((LINUART_SR & 0x80) == 0x00);  // 若发送寄存器不空,则等待
  LINUART_DR = ch;                     // 将要发送的字符送到数据寄存器 
}
 
main()
{
  // 首先初始化UART3
  UART3_Init();
  _asm("rim");                // 允许CPU全局中断
 
  while(1)                    // 进入无限循环
  {
  }                             
}
 
// 函数功能:UART3的接收中断服务程序
// 输入参数:无
// 输出参数:无
// 返 回 值:无
@far @interrupt void UART3_Recv_IRQHandler (void)
{
  unsigned char ch;
   
  ch = LINUART_DR;          // 读入接收到的字符
  UART3_SendChar(ch);       // 将字符发送出去
}                                          
 
 
 
/*    BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
 *   Copyright (c) 2007 STMicroelectronics
 */
 
typedef void @far (*interrupt_handler_t)(void);
 
struct interrupt_vector {
       unsigned char interrupt_instruction;
       interrupt_handler_t interrupt_handler;
};
 
@far @interrupt void NonHandledInterrupt (void)
{
       /* in order to detect unexpected events during development,
          it is recommended to set a breakpoint on the following instruction
       */
       return;
}
 
extern void _stext();     /* startup routine */
extern @far @interrupt void UART3_Recv_IRQHandler();
 
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, NonHandledInterrupt}, /* irq17 */
       {0x82, NonHandledInterrupt}, /* irq18 */
       {0x82, NonHandledInterrupt}, /* irq19 */
       {0x82, NonHandledInterrupt}, /* irq20 */
       {0x82, UART3_Recv_IRQHandler}, /* 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 */
};
 
回复

使用道具 举报

2

主题

18

回帖

0

蝴蝶豆

初级会员

最后登录
2018-5-11
发表于 2012-3-9 20:03:04 | 显示全部楼层

RE:【ST公益分享】STM8 -- UART

很好啊 收益了 谢谢
回复 支持 反对

使用道具 举报

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版