STM8L101F3P6单片机IO模拟收发调试Word文档格式.docx
《STM8L101F3P6单片机IO模拟收发调试Word文档格式.docx》由会员分享,可在线阅读,更多相关《STM8L101F3P6单片机IO模拟收发调试Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
STA_MARK_TX)
{
LED02=1;
Delay(0xfffFf);
LED02=0;
Delay(0xffFff);
}
else
ifnnrf_CLERN_ALL();
Delay(0xffFf);
LED02=0;
}
ifnnrf_rx_mode();
IRQ_OUT;
Delay(0x0f);
while(IRQ_I==0);
Delay(0xffff);
IRQ_OUT;
IRQ_O=1;
IRQ_IN;
if(IRQ_I==0)
{
STA_MARK_RX)
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
if(rx_buf[0]==2)
{
LED01=1;
Delay(0xffFff);
LED01=0;
Delay(0xfFfff);
rx_buf[0]=0;
}
else
IRQ_OUT;
IRQ_IN;
Delay(0x0f);
}
}
}
@far@interruptvoidTIM4_interrupt(void)
staticunsignedintTIM_Work;
staticunsignedcharTIM_Time;
if(But01==0)
{
if(TIM_Work++>
2500)
{
//LED01=~LED01;
TIM_Work=0;
else
TIM_Work=0;
//LED01=0;
TIM4_SR1=0x00;
return;
stm8_interrupt_vector.c内容
/*BASICINTERRUPTVECTORTABLEFORSTM8devices
*Copyright(c)2007STMicroelectronics
*/
typedefvoid@far(*interrupt_handler_t)(void);
structinterrupt_vector{
unsignedcharinterrupt_instruction;
interrupt_handler_tinterrupt_handler;
};
@far@interruptvoidNonHandledInterrupt(void)
{
/*inordertodetectunexpectedeventsduringdevelopment,
itisrecommendedtosetabreakpointonthefollowinginstruction
externvoid_stext();
/*startuproutine*/
extern@far@interruptvoidTIM4_interrupt(void);
structinterrupt_vectorconst_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,NonHandledInterrupt},/*irq21*/
{0x82,NonHandledInterrupt},/*irq22*/
{0x82,NonHandledInterrupt},/*irq23*/
{0x82,NonHandledInterrupt},/*irq24*/
{0x82,TIM4_interrupt},/*irq25*/
{0x82,NonHandledInterrupt},/*irq26*/
{0x82,NonHandledInterrupt},/*irq27*/
{0x82,NonHandledInterrupt},/*irq28*/
{0x82,NonHandledInterrupt},/*irq29*/
stm8l10x_diy_port.c内容
stm8l10x_gpio.h"
/**************************************************************
功能:
配置IO口
配置IO输入输出说明
输出:
配置PC_DDR,PC_CR1寄存器,把相应位拉高即可
输入:
只配置PD_CR1寄存器,拉高即可
/*************************************************************/
voidgpio_init(void)
GPIO_DeInit(GPIOB);
//恢复寄存器到默认值
GPIO_DeInit(GPIOC);
GPIO_DeInit(GPIOD);
/*配置输出****************************************************/
PC_DDR|=0x04;
//LED
PC_CR1|=0x04;
PD_DDR|=0x01;
PD_CR1|=0x01;
PC_DDR|=0x01;
//CE
PC_CR1|=0x01;
PB_DDR|=0x10;
//CSN
PB_CR1|=0x10;
PB_DDR|=0x20;
//SCK
PB_CR1|=0x20;
PB_DDR|=0x80;
//MISO
PB_CR1|=0x80;
/*配置输入****************************************************/
PC_CR1|=0x08;
//buttom
PB_CR1|=0x01;
PB_CR1|=0x40;
//mOSI
PB_CR1|=0x02;
//IRQ
LED01=1;
LED02=1;
//IRQ作为输出
CE=0;
//chipenable
CSN=1;
//Spidisable
SCK=0;
//Spiclocklineinithigh
配置时钟
voidclk_init(void)
CLK_CKDIVR=0x00;
CLK_PCKENR|=0x04;
//开启定时器4中断(必修有)
/*TIM2:
0x01
TIM3:
0x02
TIM4:
0x04
************************************************************/
延迟函数
voidDelay(unsignedintnCount)
while(nCount!
=0)
nCount--;
按键防抖动及按键锁
charKey_Scanf(charButtom)
{
staticcharKey_Lock;
charButtomStatus;
ButtomStatus=But_OFF;
if(Buttom==But_ON)
Delay(0x3ff);
/*消抖*/
if((Buttom==But_ON)&
&
(Key_Lock==1))
ButtomStatus=But_ON;
elseKey_Lock=1;
returnButtomStatus;
stm8l10x_diy_port.h内容
#ifndef__stm8l10x_diy_port_H
#define__stm8l10x_diy_port_H
#defineL0
#defineH1
#defineBut_ON0//按下时为低
#defineBut_OFF1
#defineIRQ_OUTPB_DDR|=0x02//配置输出
#defineIRQ_INPB_DDR&
=0xFD//配置输入
_BoolIRQ_O@PB_ODR:
1;
//IRQ输出。
使用IRQ_O=1;
_BoolIRQ_I@PB_IDR:
//IRQ输入。
使用if(IRQ_I==1)
/*LED灯系列,输出**********************************************/
_BoolLED02@PD_ODR:
0;
_BoolLED01@PC_ODR:
2;
/*按键系列,输入***********************************************/
_BoolBut01@PB_IDR:
_BoolBut02@PC_IDR:
3;
_BoolCE@PC_ODR:
_BoolCSN@PB_ODR:
4;
_BoolSCK@PB_ODR:
5;
_BoolMOSI@PB_IDR:
6;
//MOSI
_BoolMISO@PB_ODR:
7;
#defineButtom01Key_Scanf(But01)//宏定义函数
#defineButtom02Key_Scanf(But02)
voidgpio_init(void);
voidclk_init(void);
voidDelay(unsignedintnCount);
charKey_Scanf(charButtom);
#endif
stm8l10x_diy_time.c内容
stm8l10x_tim4.h"
//#defineLibrary_function
voidtime_init(void)
_asm("
sim"
);
#ifdefLibrary_function
TIM4_DeInit();
TIM4_TimeBaseInit(TIM4_Prescaler_1,100);
TIM4_Cmd(ENABLE);
TIM4_ITConfig(TIM4_IT_Update,ENABLE);
TIM4_ARRPreloadConfig(ENABLE);
#else
TIM4_ARR=100;
//定时0.1ms
TIM4_IER=0x01;
//使能溢出中断
TIM4_PSCR=0x04;
//16分频
TIM4_CR1=0x01;
//enableTimer4
#endif
rim"
//中断总开关
stm8l10x_diy_time.h内容
#ifndef__stm8l10x_diy_time_H
#define__stm8l10x_diy_time_H
voidtime_init(void);
NRF24L01.c内容
stm8L10X_DIY_PORT.h"
//#defineRX_DRsta&
0x40
//#defineTX_DSsta&
0x20
//#defineMAX_RTsta&
0x10
unsignedcharTX_ADDRESS[5]={0x34,0x43,0x10,0x10,0x01};
unsignedcharrx_buf[TX_PLOAD_WIDTH];
unsignedchartx_buf[TX_PLOAD_WIDTH];
unsignedcharflag;
/*****************状态标志*****************************************/
unsignedcharsta;
//状态标志
/*****************SPI时序函数******************************************/
unsignedcharSPI_RW(unsignedchardate)
unsignedchari;
for(i=0;
i<
8;
i++)//循环8次
if(date&
0x80)
MISO=1;
else
MISO=0;
//byte最高位输出到MOSI
date<
<
=1;
//低一位移位到最高位
SCK=1;
if(MOSI)//拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
date|=0x01;
//读MISO到byte最低位
SCK=0;
//SCK置低
return(date);
//返回读出的一字节}
/**************************************************/
/**************************************************
Function:
SPI_RW_Reg();
Description:
Writesvalue'
value'
toregister'
reg'
unsignedcharSPI_RW_Reg(unsignedcharreg,unsignedcharvalue)
unsignedcharstatus;
CSN=0;
//CSNlow,initSPItransaction
status=SPI_RW(reg);
//selectregister
SPI_RW(value);
//..andwritevaluetoit..
CSN=1;
//CSNhighagain
return(status);
//returnnRF24L01statusbyte
SPI_Read();
ReadonebytefromnRF24L01register,'
unsignedcharSPI_Read(unsignedcharreg)
unsignedcharreg_val;
//CSNlow,initializeSPIcommunication...
SPI_RW(reg);
//Selectregistertoreadfrom..
reg_val=SPI_RW(0);
//..thenreadregistervalue
//CSNhigh,terminateSPIcommunication
return(reg_val);
//returnregistervalue
SPI_Read_Buf();
Reads'
bytes'
#ofbytesfromregister'
TypicallyusedtoreadRXpayload,Rx/Txaddress
unsignedcharSPI_Read_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharbytes)
unsignedcharstatus,byte_ctr;
//SetCSNlow,initSPItranaction
//Selectregistertowritetoandreadstatusbyte
for(byte_ctr=0;
byte_ctr<
bytes;
byte_ctr++)
pBuf[byte_ctr]=SPI_RW(0);
//PerformSPI_RWtoreadbytefromnRF24L01
//SetCSNhighagain
//r