本来刚接触STM8
单片机使用的是STM8S103F3P6,想法为想实现两单片机的串口通讯,主机发0x01 从机接如果收到0x01亮1指示灯,如果接收不是0x01亮另一指示灯,接收用中断,可两指示灯都没亮啊,根本没进中断,大侠们帮我看看是不是哪里配置有问题。
1)硬件很简单 主:TX-从RX 主:RX-从:TX 中间接一1K电阻,TX RX分别接有5.1K上拉电阻,5V供电
2)发送程序如下:
#include "iostm8s103f3.h"
/************************************/
/***************宏定义***************/
/************************************/
#define ON 1
#define OFF 0
#define POWER_LED (PD_ODR_ODR3) //
电源显示 PD3
#define HIGHF_LED (PA_ODR_ODR3) //强风显示 PA3
#define BAOC_LED (PA_ODR_ODR1) //爆炒显示 PA1
#define LOWF_LED (PC_ODR_ODR5) //低风显示 PC5
#define LIGHT_LED (PC_ODR_ODR4) //照明显示 Pc4
/************************************/
/*************系统初始化*************/
/************************************/
void Sysinit(void)
{
PA_DDR = 0xff; //输出模式
PA_ODR = 0xff; //输出1
PA_CR2 = 0x00; //输出 2MHZ
PA_CR1 = 0xff; //推挽输出
PB_DDR = 0xff; //输出模式
PB_ODR = 0xff; //输出1
PB_CR2 = 0x00; //输出 2MHZ
PB_CR1 = 0xff; //推挽输出
PC_DDR = 0xff; //PC4输入 AD口
PC_ODR = 0xff; //PC4输出0 其他输出1 PC5 FTC334C电源初值为1
PC_CR2 = 0x00; //输出 2MHZ
PC_CR1 = 0xff; //推挽输出 PC4浮空输入
//PD_DDR = 0xff; //PD1 2 3 4 5 6 7输出模式
//PD_ODR = 0xff; //PD1 2 3 4 5 6 7输出1
// PD_CR2 = 0x00; //输出 2MHZ
//PD_CR1 = 0xdf; //PD5 Tx开漏输出
CLK_ICKR = 0x01; //bit 0开HSI时钟
while(!CLK_ICKR_HSIRDY) ; //等待HSI时钟准备就绪
CLK_ECKR = 0x00; //外部时钟关
CLK_CKDIVR = 0x18; //bit4-3 00:HSI/1 01:HSI/2 10:HSI/4 11:HSI/8 Tcpu=HSI/8=2MHZ
CLK_PCKENR1 = 0x00; //开
tiM4时钟 其他外设时钟关
CLK_PCKENR2 = 0x00; //bit2 BEEP
}
//串口初始化函数
void USART_Init(void)
{
PD_DDR = ~(1<<5);
PD_CR1 |= (1<<5);
PD_ODR |= (1<<5);
PD_DDR = ~(1<<6);
PD_CR1 |= (1<<6);
PD_ODR |= (1<<6);
CLK_PCKENR1|= 0x04; //开启串口时钟
UART1_CR2 |= 0x00; //发送禁止
UART1_CR1 = 0x00; //8位数据 不用奇偶校验
UART1_CR3 = 0x00; //1位停止位 不开启同步模式
UART1_BRR2 = 0x00; //9600 @2MHZ
UART1_BRR1 = 0x0d; //9600 @2MHZ
UART1_CR2 |= 0x08; //开启发送使能
}
void Send_Date(uint8_t date)
{
while(!(UART1_SR 0x80)) ; //等待发送数据寄存器空
UART1_DR = date;
while(!(UART1_SR 0x40)) ; //等待发送完成
}
void main(void)
{
Sysinit();
USART_Init();
Send_Date(0x01);
//if(UART1_SR 0x80) {HIGHF_LED = 0;}
while(1) ;
}
3)接收程序如下:
#include "iostm8s103f3.h"
/************************************/
/***************宏定义***************/
/************************************/
#define ON 1
#define OFF 0
#define POWER_LED (PD_ODR_ODR3) //电源显示 PD3
#define HIGHF_LED (PA_ODR_ODR3) //强风显示 PA3
#define LOWF_LED (PC_ODR_ODR5) //低风显示 PC5
#define LIGHT_LED (PC_ODR_ODR4) //照明显示 Pc4
uint8_t temp;
/************************************/
/*************系统初始化*************/
/************************************/
void Sysinit(void)
{
PA_DDR = 0xff; //输出模式
PA_ODR = 0xff; //输出1
PA_CR2 = 0x00; //输出 2MHZ
PA_CR1 = 0xff; //推挽输出
PB_DDR = 0xff; //输出模式
PB_ODR = 0xff; //输出1
PB_CR2 = 0x00; //输出 2MHZ
PB_CR1 = 0xff; //推挽输出
PC_DDR = 0xff; //PC4输入 AD口
PC_ODR = 0xff; //PC4输出0 其他输出1 PC5 FTC334C电源初值为1
PC_CR2 = 0x00; //输出 2MHZ PD6禁止外部中断
PC_CR1 = 0xff; //推挽输出 PD6带上拉电阻输入
//PD_DDR = 0xbf; //PD6 输入模式 Rx 引脚
//PD_ODR = 0xff; //PD1 2 3 4 5 6 7输出1
// PD_CR2 = 0x00; //输出 2MHZ
//PD_CR1 = 0xff; //推挽输出
CLK_ICKR = 0x01; //bit 0开HSI时钟
while(!CLK_ICKR_HSIRDY) ; //等待HSI时钟准备就绪
CLK_ECKR = 0x00; //外部时钟关
CLK_CKDIVR = 0x18; //bit4-3 00:HSI/1 01:HSI/2 10:HSI/4 11:HSI/8 Tcpu=HSI/8=2MHZ
CLK_PCKENR1 = 0xff; //开TIM4时钟 其他外设时钟关
CLK_PCKENR2 = 0xff; //bit2 BEEP
}
void Delay_us(uint16_t us)
{
while(us--) ;
}
void Delay_ms(uint16_t ms)
{
uint16_t i;
while(ms--)
{
for(i=0;i<1420;i++)
{
;
}
}
}
//串口初始化函数
void USART_Init(void)
{
//CLK_PCKENR1|= 0x04; //开启串口时钟
PD_DDR = ~(1<<5);
PD_CR1 |= (1<<5);
PD_ODR |= (1<<5);
PD_DDR = ~(1<<6);
PD_CR1 |= (1<<6);
PD_ODR |= (1<<6);
UART1_CR1 = 0x00; //8位数据 不用奇偶校验
UART1_CR3 = 0x00; //1位停止位 不开启同步模式
UART1_BRR2 = 0x00; //9600 @2MHZ
UART1_BRR1 = 0x0d; //9600 @2MHZ
UART1_CR2 = 0x24; //接收中断使能 开启接收使能
asm("rim") ; //允许CPU全局中断 STVD中为_asm("rim"); 开全局中断
}
#pragma vector=UART1_R_RXNE_vector
__interrupt void UART1_R_RXNE_vector_IRQHandler(void)
{
temp = UART1_DR;
if(temp == 0x01) {HIGHF_LED = 0;}
else {LOWF_LED = 0;}
}
void main(void)
{
Sysinit();
USART_Init();
// LIGHT_LED = 0;
while(1) ;
}