初级会员
积分 88
金钱 88
注册时间 2013-12-29
在线时间 17 小时
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);//情况中断标志位
}
}
我来回答