OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2400|回复: 4

STM8L152R8库函数串口2调不通

[复制链接]

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2013-12-29
在线时间
17 小时
发表于 2022-5-20 00:36:57 | 显示全部楼层 |阅读模式
5金钱
我参考了网上的例程,用该例程串口1可以调通,为什么改成串口2或者是串口3就不行了。
下面是串口2调试的代码:
#include "stm8l15x.h"
#include <stdio.h>
#include<string.h>

u16 number1 ;
float testfloat;
const char number2[] = "KQ_STM8L152K4 Test Printf OK!!";
/*******************************************************************************
**函数名称:void delay(unsigned int ms)     
**功能描述:大概延时[非精确延时]
**入口参数:unsigned int ms
**输出:无
*******************************************************************************/
void delay(unsigned int ms)
{
  unsigned int x , y;
  for(x = ms; x > 0; x--)           /*  通过一定周期循环进行延时*/
    for(y = 1000 ; y > 0 ; y--);
}

/*******************************************************************************
**函数名称:void UART1_Init(u32 baudrate)
**功能描述:初始化USART模块
**入口参数:u32 baudrate  -> 设置串口波特率
**输出:无
*******************************************************************************/
void UART2_Init(u32 baudrate)
{   

GPIO_DeInit(GPIOE);
GPIO_Init(GPIOE, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);//GPIO_MODE_IN_PU_NO_IT);//发送数据IO
  GPIO_Init(GPIOE, GPIO_Pin_4, GPIO_Mode_In_FL_No_IT);//接受数据IO
  CLK_PeripheralClockConfig(CLK_Peripheral_USART2 , ENABLE); //使能USART1时钟
  USART_Init(USART2,                //设置USART1
            baudrate,               //波特率设置
            USART_WordLength_8b,    //数据长度设为8位
            USART_StopBits_1,       //1位停止位
            USART_Parity_No,        //无校验
            (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));  //设置为发送接收双模式
  
  USART_ITConfig(USART2, USART_IT_RXNE , ENABLE);  //使能接收中断
  USART_Cmd(USART2 , ENABLE);       //使能USART1开始工作
}
/*******************************************************************************
**函数名称:void Uart_SendData(u8  data)
**功能描述:向串口发送寄存器写入一个字节数据
**入口参数:u8  data
**输出:无
*******************************************************************************/
void Uart_SendData(u8  data)
{
    while(USART_GetFlagStatus(USART2 , USART_FLAG_TXE) == 0);        //判断发送数据寄存器是否为空   
    USART_SendData8(USART2 , (u8)data);                     //向发送寄存器写入数据      
}
/*******************************************************************************
**函数名称:int fputc(int ch, FILE *f)
**功能描述:是Printf库函数的中间连接函数
**入口参数:
**输出:无
*******************************************************************************/
int fputc(int ch, FILE *f)
{      
    Uart_SendData((u8)(ch));     
    return ch;
}
/*******************************************************************************
**函数名称:void ClockSwitch_HSE()
**功能描述:将系统时钟切换到外部高速晶振时钟
**入口参数:无
**输出:无
*******************************************************************************/
void ClockSwitch_HSE()
{
    //启用外部高速晶振且16分频,外部晶振1-16MHz
   
    CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSE);       //系统主时钟为HSE
    CLK_HSEConfig(CLK_HSE_ON);          //使能HSE起振
    while(CLK_GetFlagStatus(CLK_FLAG_HSERDY)== RESET);  //等待HSE准备就绪
    CLK_SYSCLKSourceSwitchCmd(ENABLE);  //使能时钟切换
    while(CLK_GetFlagStatus(CLK_FLAG_SWBSY) != RESET);
    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);   //如果切换成功,则设置为1分频,让外部16M时钟作为系统时钟
   
    CLK_SYSCLKSourceSwitchCmd(DISABLE);     //关闭切换
}
/*  主函数  */
void main()
{
  number1 = 28;
  testfloat = 168.5;
  
  disableInterrupts();  //关闭系统总中断
  CLK_HSICmd(ENABLE);
// ClockSwitch_HSE();    //外部高速晶振16Mhz 作为系统时钟
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  UART2_Init(9600);     //调用LED1、LED2、LED3流水灯对应IO口初始化
  enableInterrupts();   //使能系统总中断
  while(1)
  {
//等待USART1接收字符中断产生,中断服务函数在  stm8l15x_it.c文件里的 函数 INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
//并且把接收到字符返送回去
    delay(1000);
    //标准输出浮点数,整数,字符串
    printf("\r\nFloat_number = %0.2f , Number1 = %d , Number2 = %s" ,
            testfloat , number1 , number2);
  }   
  
}

中断函数
INTERRUPT_HANDLER(TIM2_CC_USART2_RX_IRQHandler,20)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
    u8 Res;
    if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET)  //接收中断(接收到的数据必须是)
    {
        Res = USART_ReceiveData8(USART2);//(USART1->DR);//读取接收到的数据
        USART_SendData8(USART2 , Res);
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);//情况中断标志位
     }

}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-5-21 01:13:53 | 显示全部楼层
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2022-5-24
在线时间
2 小时
发表于 2022-5-31 16:57:19 | 显示全部楼层
请问您解决了吗
回复

使用道具 举报

2

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2012-9-2
在线时间
47 小时
发表于 2024-6-24 09:15:51 | 显示全部楼层
初始化串口3,4吗?
回复

使用道具 举报

2

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2012-9-2
在线时间
47 小时
发表于 2024-6-24 09:16:30 | 显示全部楼层

不是串口2,3吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 06:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表