|
STM8S103F3P6+cc1101透传 串口接收中断程序无法运行,急 ...
[复制链接]
10芯积分
向各位高手求助,已经做了两天多了还没搞定。新手上路
采用stm8s103f3p6单片机,连接cc1101透传(接vcc gnd txd rxd就行)无线通信模块,向连接虚拟串口usb的pc调试助手收发数据。
板子是单独供电,还需要一个USART转USB接口下载程序。有图
搜狗截图20180415140805.png (34.89 KB, 下载次数: 0)
下载附件 保存到相册
12 分钟前 上传
试了一下,串口调试助手可以通过ST-LINK V2发送数据给单片机(LCD1602有显示),但是通过虚拟串口USB向cc1101发送数据,就接收不到。想请教一下什么问题。代码如下:
#include
#define uint unsigned int //定义常用数据类型替代码
#define uchar unsigned char
#define CLR_RS PA_ODR_bit.ODR1 = 0
#define SET_RS PA_ODR_bit.ODR1 = 1
#define CLR_EN PA_ODR_bit.ODR2 = 0
#define SET_EN PA_ODR_bit.ODR2 = 1
/******定义函数****************/
void Delay(uint ms); //延时程序
void LCD_init(void); //液晶初始化
void LCD_write_command(uchar command); //液晶写数据程序
void LCD_clear(void);//清屏
void LCD_write_data(uchar dat); //液晶写指令程序
void LCD_set_xy (uchar x, uchar y);//位置
void display(void); //显示程序
void Delay(unsigned int ms)
{
unsigned int x,y;
for(x=ms;x>0;x--)
for(y=1600;y>0;y--);
}
void LCD_clear(void)
{
LCD_write_command(0x01);//清除屏幕显示
Delay(5);
}
void LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
Delay(5);//
}
//写指令函数——写地址
void LCD_write_command(uchar command)
{
CLR_EN;
//CLR_RW;
CLR_RS;
PD_ODR=(command<<1);
PC_ODR=command;
SET_EN;
CLR_EN;
Delay(5);//
}
//写数据函数
void LCD_write_data(uchar dat)
{
CLR_EN;
//CLR_RW;
SET_RS;
PD_ODR=(dat<<1);
PC_ODR=dat;
SET_EN;
CLR_EN;
Delay(5);
}
void LCD_set_xy( uchar x, uchar y )//写位置程序
{
uchar address;
if (y == 0) address = 0x80 + x;
else address = 0xc0 + x;
LCD_write_command( address);
}
void LCD_print(char *str)
{
while(*str)
{
LCD_write_data(*str);
Delay(5);
str++;
}
}
/*******************************************************************************
**函数名称:void UART1_Init(unsigned int baudrate)
**功能描述:初始化USART模块
**入口参数:unsigned int baudrate -> 设置串口波特率
**输出:无
*******************************************************************************/
void UART1_Init(unsigned long baudrate)
{
unsigned int baud; //
baud = 16000000 / baudrate; //设定串口相应波特率与串口时钟的分频数
//先写BRR2 , 再写BRR1
UART1_BRR2 = ((unsigned char)((baud & 0xf000) >> 8 )) | ((unsigned char)(baud & 0x000f)); //先写波特比率的高4位与低4位
UART1_BRR1 = ((unsigned char)((baud & 0x0ff0) >> 4)); //后写波特比率的中间8位
UART1_CR1_bit.UART0 = 0; //使能UART0
UART1_CR2_bit.RIEN = 1; //使能中断接收
UART1_CR2_bit.TEN = 1; //使能发送
UART1_CR2_bit.REN = 1; //接收使能
}
/*******************************************************************************
**函数名称:void Uart_SendData(unsigned char data)
**功能描述:向串口发送寄存器写入一个字节数据
**入口参数:unsigned char data
**输出:无
*******************************************************************************/
void Uart_SendData(unsigned char data)
{
while(!(UART1_SR&0X80)); //判断发送数据寄存器是否为空
UART1_DR = data; //向发送寄存器写入数据
}
/*******************************************************************************
**函数名称:void Uart_SendString(unsigned char *data , unsigned char strlen)
**功能描述:向串口连续发送多个字符
**入口参数: char *data
**输出:无
*******************************************************************************/
void Uart_SendString( char *data)
{
while(*data)
{
Uart_SendData(*data++);
}
}
void CLKInit()
{
CLK_CKDIVR = 0x00; //内部高速时钟16MHZ 进行1分频
CLK_ICKR_bit.LSIEN = 1; // 打开芯片内部的低速振荡器LSI
while(CLK_ICKR_bit.LSIRDY == 0); // 等待振荡器稳定
}
int main(void)
{
PD_DDR |= 0x0E;//PD1-3设置为输出模式0x1E
PD_CR1 |= 0x0E;
PD_CR2 |= 0x0E;
PC_DDR |= 0xF8;//PC3-7设置为输出模式0xF0
PC_CR1 |= 0xF8;
PC_CR2 |= 0xF8;
PA_DDR |= 0x06;//PA1,PA2设置为输出模式0x06
PA_CR1 |= 0x06;
PA_CR2 |= 0x06;
asm("sim"); //关总中断
CLKInit();
UART1_Init(4800);
LCD_clear();
LCD_init();
asm("rim"); //打开系统总中断
while(1)
{
;
}
}
/* 串口接收数据中断服务函数 */
#pragma vector = 0x14 //设置串口接收中断向量号 = 0X14
__interrupt void UART1_RX_RXNE(void)
{
unsigned char ch1;
UART1_SR_bit.RXNE = 0; //清除中断标志
// if(UART1_SR&UART1_SR_bit.OR_LHE)
// { UART1_SR &=(~UART1_SR_bit.OR_LHE);
// }
ch1 = UART1_DR; //读出串口接收到的数据
// Uart_SendData(ch1); //把接收到的数据再通过串口发送出去
LCD_set_xy(0,0);
LCD_write_data(ch1);
}
求救求救!!!!
|
|