标题:
STM8S资源模块配置
[打印本页]
作者:
xiaos
时间:
2015-4-10 17:00
标题:
STM8S资源模块配置
1:UART
void UART_Init(void)
{
#define BRR 9600//定义波特率(修改波特率只需要修改这个宏的值就可以了)
#define Fosc 16000000 //定义CPU频率
#define BRR1 (((Fosc)/(BRR))>>4)
#define BRR2 (((((Fosc)/(BRR))&0xf000)>>8)|(((Fosc)/(BRR))&0x000f))
CLK_PCKENR1|=1<<2;//开启UART1时钟
UART1_CR2&=~(1<<2);//先关闭接收
UART1_CR2&=~(1<<3);//先关闭发送
UART1_BRR2=BRR2;//设置波特率 先给BRR2赋值在给BRR1赋值
UART1_BRR1=BRR1;
UART1_CR1&=~(1<<2);//不使用奇偶校验
UART1_CR1&=~(1<<4);//选择1个起始位 8个数据位
UART1_CR3&=~(1<<4);//选择1个停止位
UART1_CR3&=~(1<<5);//选择1个停止位
UART1_CR2&=~(1<<6);//不使用发送中断
UART1_CR2|=(1<<5);//使用接收中断
UART1_CR1&=~(1<<5);//启动UART1
UART1_CR2|=(1<<2);//启动接收
UART1_CR2|=(1<<3);//启动发送
}
void UART_SendByte(uint8_t Byte)
{
while(UART1_SR&(1<<7)==0);
UART1_DR=Byte;
}
2:TIM4
#define PERIOD 100
#define ARR ((0xff)-(PERIOD))
TIM4_IER=0x00;//关闭所有中断
TIM4_PSCR=0x07;//计数器频率=16MHZ/2^4;
TIM4_CNTR=ARR;
TIM4_ARR=ARR;
TIM4_EGR|=(1<<0);//产生更新事件
TIM4_CR1|=(1<<0);//开启TIM4的计数器
TIM4_SR&=~(1<<0);// 清除中断标志
TIM4_IER|=(1<<0);// 开启更新中断
3:TIM2
static void TIM2_Configuration(void)
{
#define Period (1000)
#define ARRH ((0xffff-Period)&0xff00)
#define ARRL ((0xffff-Period)&0x00ff)
TIM2_ARRH=ARRH;
TIM2_ARRL=ARRL;
TIM2_PSCR=4;//16MHZ/2^4=1MHZ
TIM2_EGR|=SETBIT(0);//开启更新事件
TIM2_IER|=SETBIT(0);//开启更新中断
// TIM2_CR1|=SETBIT(0);//开启计数器
TIM2_CR1&=CLRBIT(0);
}
@far @interrupt void TIM2_IRQHandler(void)
{
TIM2_SR1&=CLRBIT(0);//清除中断标志
Time++;
}
4:PWM
static void TIM3_PWM_Configuration(void)
{
#define Period (100)
#define ARRL ((0xffff-Period)&0x00ff)
#define ARRH ((0xffff-Period)&0xff00)
/* 时间基础设置*/
TIM3_ARRH=0;
TIM3_ARRL=100;
/*PWM*/
TIM3_CCMR1|=0x70;//PWM模式2
TIM3_CCER1|=SETBIT(0);//开启TIM3通道3输出
TIM3_CCR1H=0;//
TIM3_CCR1L=10;//
TIM3_PSCR=4;//分频16/2^4=1
TIM3_EGR|=SETBIT(0);//事件
TIM3_IER|=SETBIT(0);//中断
TIM3_CR1|=SETBIT(0);//开启计数器
}
@far @interrupt void TIM3_IRQHandler(void)
{
TIM3_SR1&=CLRBIT(0);
Time++;
}
5:外部中断4 //不需要清除中断标志
//PA4 上拉输入
PA_DDR &= CLRBIT4;
PA_CR1 |= SETBIT4;
//下降沿触发
EXTI_CR1 |= SETBIT1;
EXTI_CR1 &= CLRBIT0;
//开启端口中断
PA_CR2 |= SETBIT4;
6: ADC
void Driver_ADCON(void)
{
//开ADC时钟
CLK_PCKENR2 |= SETBIT3;
//ADC转换结束中断禁止
ADC_CSR = 0x00;
//数据右对齐
ADC_CR2 |= SETBIT3;
}
/********************************************************************************************************
* Function: Driver_ADCKick
* Object: ADC通道选择 执行一次ADC
* 输入: ADC通道
* 输出: 无
* 备注: 无
********************************************************************************************************/
void Driver_ADCKick(u8 Channel)
{
//匹配通道
ADC_CSR = (ADC_CSR&0xf8)|Channel;
//使能检测
ADC_CR1 |= SETBIT0;
}
/********************************************************************************************************
* Function: Driver_ADCGet
* Object: 读ADC检测值 10位长
* 输入: ADC值存放指针
* 输出: 1 转换成功; 0 等待转换;
* 备注: 0~1023
********************************************************************************************************/
bool Driver_ADCGet(u16 *Value)
{
u8 Temp;
//等待转换
if(!(ADC_CSR&CHSBIT7))
return 0;
//读AD结果
*Value = ADC_DRL;
Temp = ADC_DRH;
*Value = (Temp*0x100) + (*Value);
//清转换结束标志
ADC_CSR &= CLRBIT7;
return 1;
}
7:I2C
**********/
void Driver_I2CON(void)
{
//开I2C时钟
CLK_PCKENR1 |= SETBIT0;
//I2C模式选择 标准模式
I2C_CCRH &= CLRBIT7;
//设置输入时钟fck 标准模式>1M(配置2M)
I2C_FREQR = 0x02;
//则标准(fsc为通信速率):
//tck=1/fck=0.5us
//CCR=1/(2fsc*tck) = 1000000/2fsc*0.5 = 1000000/fsc
//按速率设置宏定义 配置通信速率 10Kbps
I2C_CCRH = 0;
I2C_CCRL = 100;
//配置上升时间寄存器
I2C_TRISER = 3;
//开启I2C模块
I2C_CR1 |= SETBIT0;
}
/********************************************************************************************************
* Function: Driver_I2CSend
* Object: 硬件I2C发送
* 输入: 从设备地址; 待发送数据的头指针; 待发数据的长;
* 输出: 无
* 备注: 通信中如果出现超时故障 则直接返回 避免长等待
********************************************************************************************************/
void Driver_I2CSend(u8 Address,u8 *DataBuff,u16 DataLen)
{
u8 temp;
u16 time;
//等待总线空闲
time = 500;
while(I2C_SR3&CHSBIT1)
if(!--time)
return;
//发起始条件
I2C_CR2 |= SETBIT0;
//等待发送完毕
time = 500;
while((I2C_SR1&CHSBIT0)==0)
if(!--time)
return;
//短暂延时
_asm("nop");
_asm("nop");
_asm("nop");
temp = I2C_SR1;
//发从地址
I2C_DR = Address;
//等待ACK应答
time = 500;
while((I2C_SR1&CHSBIT1)==0)
if(!--time)
return;
//短暂延时
_asm("nop");
_asm("nop");
_asm("nop");
temp = I2C_SR1;
//清ADDR标志
temp = I2C_SR3;
//发送数据
for(;DataLen>0;DataLen--,DataBuff++)
{
//等待寄存器为空
time = 500;
while(!(I2C_SR1&CHSBIT7))
if(!--time)
return;
I2C_DR = *DataBuff;
//等待发送完毕
time = 500;
while(!(I2C_SR1&CHSBIT2))
if(!--time)
return;
_asm("nop");
_asm("nop");
_asm("nop");
}
//发停止条件,关闭通信
//清BTF位
temp = I2C_SR1;
temp = I2C_DR;
//发停止
I2C_CR2 |= SETBIT1;
}
/********************************************************************************************************
* Function: Driver_I2CRecv
* Object: 硬件I2C接收
* 输入: 从设备地址;待接收数据的头指针;待接收数据的长;
* 输出: 无
* 备注: 通信中如果出现超时故障 则直接返回 避免长等待
********************************************************************************************************/
void Driver_I2CRecv(u8 Address,u8 *DataBuff,u16 DataLen)
{
u8 temp;
u16 time;
//等待总线空闲
time = 500;
while(I2C_SR3&CHSBIT1)
if(!--time)
return;
//发起始条件
I2C_CR2 |= SETBIT0;
//等待发送完毕
time = 500;
while(!(I2C_SR1&CHSBIT0))
if(!--time)
return;
_asm("nop");
_asm("nop");
_asm("nop");
temp = I2C_SR1;
//发从地址
I2C_DR = Address;
//等待ACK应答
time = 500;
while(!(I2C_SR1&CHSBIT1))
if(!--time)
return;
_asm("nop");
_asm("nop");
_asm("nop");
temp = I2C_SR1;
//清ADDR标志
temp = I2C_SR3;
//接收数据,读DataLen-1个数
//使能ACK应答
I2C_CR2 |= SETBIT2;
for(;DataLen>1;DataLen--,DataBuff++)
{
//等待寄存器为满
time = 500;
while(!(I2C_SR1&CHSBIT6))
if(!--time)
return;
*DataBuff = I2C_DR;
}
//关闭ACK应答
I2C_CR2 &= CLRBIT2;
//发停止条件,关闭通信
//清BTF位
temp = I2C_SR1;
temp = I2C_DR;
//发停止
I2C_CR2 |= SETBIT1;
_asm("nop");
_asm("nop");
_asm("nop");
//读最后一个数
time = 500;
while(!(I2C_SR1&CHSBIT6))
if(!--time)
return;
*DataBuff = I2C_DR;
}
8:SPI
* Function: Driver_SPION
* Object: 打开SPI模块,并执行初始化
* 输入: 无
* 输出: 无
* 备注: 主模式 四线连接 硬件SPI sck mosi misi
/***************************************************************************/
void Driver_SPION(void)
{
//开启时钟
CLK_PCKENR1 |= SETBIT1;
//控制寄存器CR1先清零
SPI_CR1 = 0x00;
//配置通信波特率1Mbps
SPI_CR1 &= 0xC7;
//配置时钟的相位与极性
//空闲状态时,SCK保持低电平
SPI_CR1 &= CLRBIT1;
//数据采样从第一个时钟边沿开始
SPI_CR1 &= CLRBIT0;
//定义帧格式
//通信时,串行移位,高位在前,低位在后
SPI_CR1 &= CLRBIT7;
//设置SPI工作模式
//NSS引脚软件管理
SPI_CR2 |= SETBIT1;
SPI_CR2 |= SETBIT0;
//主设备选择
SPI_CR1 |= SETBIT2;
//端口配置为快速摆率
PC_DDR |= SETBIT5;
PC_CR1 |= SETBIT5;
PC_CR2 |= SETBIT5;
PC_DDR |= SETBIT6;
PC_CR1 |= SETBIT6;
PC_CR2 |= SETBIT6;
PC_CR1 |= SETBIT7;
//使能SPI
SPI_CR1 |= SETBIT6;
}
/***************************************************************************
* Function: Driver_SPISend
* Object: SPI发送数据
* 输入: &DataBuff 发送数据缓存的头指针;DataLen 发送数据的个数;
* 输出: 无
* 备注: 主模式 四线连接 硬件SPI sck mosi misi
/***************************************************************************/
void Driver_SPISend(u8 *DataBuff,u16 DataLen)
{
u8 temp;
//执行发送
for(;DataLen>0;DataBuff++,DataLen--)
{
//等待发送
while(!(SPI_SR&CHSBIT1));
//发送数据
SPI_DR = *DataBuff;
}
//等待总线空闲
temp = SPI_DR;
while(SPI_SR&CHSBIT7);
}
/***************************************************************************
* Function: Driver_SPIReceive
* Object: SPI接收数据
* 输入: &DataBuff 接收数据缓存的头指针;DataLen 接收数据的个数;
* 输出: 无
* 备注: 主模式 四线连接 硬件SPI sck mosi misi
/***************************************************************************/
void Driver_SPIReceive(u8 *DataBuff,u16 DataLen)
{
//执行接收
for(;DataLen>0;DataBuff++,DataLen--)
{
//等待接收
while(!(SPI_SR&CHSBIT0));
//接收数据
*DataBuff = SPI_DR;
}
//等待总线空闲
while(SPI_SR&CHSBIT7);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1