標(biāo)題:
STM8S資源模塊配置
[打印本頁(yè)]
作者:
xiaos
時(shí)間:
2015-4-10 17:00
標(biāo)題:
STM8S資源模塊配置
1:UART
void UART_Init(void)
{
#define BRR 9600//定義波特率(修改波特率只需要修改這個(gè)宏的值就可以了)
#define Fosc 16000000 //定義CPU頻率
#define BRR1 (((Fosc)/(BRR))>>4)
#define BRR2 (((((Fosc)/(BRR))&0xf000)>>8)|(((Fosc)/(BRR))&0x000f))
CLK_PCKENR1|=1<<2;//開啟UART1時(shí)鐘
UART1_CR2&=~(1<<2);//先關(guān)閉接收
UART1_CR2&=~(1<<3);//先關(guān)閉發(fā)送
UART1_BRR2=BRR2;//設(shè)置波特率 先給BRR2賦值在給BRR1賦值
UART1_BRR1=BRR1;
UART1_CR1&=~(1<<2);//不使用奇偶校驗(yàn)
UART1_CR1&=~(1<<4);//選擇1個(gè)起始位 8個(gè)數(shù)據(jù)位
UART1_CR3&=~(1<<4);//選擇1個(gè)停止位
UART1_CR3&=~(1<<5);//選擇1個(gè)停止位
UART1_CR2&=~(1<<6);//不使用發(fā)送中斷
UART1_CR2|=(1<<5);//使用接收中斷
UART1_CR1&=~(1<<5);//啟動(dòng)UART1
UART1_CR2|=(1<<2);//啟動(dòng)接收
UART1_CR2|=(1<<3);//啟動(dòng)發(fā)送
}
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;//關(guān)閉所有中斷
TIM4_PSCR=0x07;//計(jì)數(shù)器頻率=16MHZ/2^4;
TIM4_CNTR=ARR;
TIM4_ARR=ARR;
TIM4_EGR|=(1<<0);//產(chǎn)生更新事件
TIM4_CR1|=(1<<0);//開啟TIM4的計(jì)數(shù)器
TIM4_SR&=~(1<<0);// 清除中斷標(biāo)志
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);//開啟計(jì)數(shù)器
TIM2_CR1&=CLRBIT(0);
}
@far @interrupt void TIM2_IRQHandler(void)
{
TIM2_SR1&=CLRBIT(0);//清除中斷標(biāo)志
Time++;
}
4:PWM
static void TIM3_PWM_Configuration(void)
{
#define Period (100)
#define ARRL ((0xffff-Period)&0x00ff)
#define ARRH ((0xffff-Period)&0xff00)
/* 時(shí)間基礎(chǔ)設(shè)置*/
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);//開啟計(jì)數(shù)器
}
@far @interrupt void TIM3_IRQHandler(void)
{
TIM3_SR1&=CLRBIT(0);
Time++;
}
5:外部中斷4 //不需要清除中斷標(biāo)志
//PA4 上拉輸入
PA_DDR &= CLRBIT4;
PA_CR1 |= SETBIT4;
//下降沿觸發(fā)
EXTI_CR1 |= SETBIT1;
EXTI_CR1 &= CLRBIT0;
//開啟端口中斷
PA_CR2 |= SETBIT4;
6: ADC
void Driver_ADCON(void)
{
//開ADC時(shí)鐘
CLK_PCKENR2 |= SETBIT3;
//ADC轉(zhuǎn)換結(jié)束中斷禁止
ADC_CSR = 0x00;
//數(shù)據(jù)右對(duì)齊
ADC_CR2 |= SETBIT3;
}
/********************************************************************************************************
* Function: Driver_ADCKick
* Object: ADC通道選擇 執(zhí)行一次ADC
* 輸入: ADC通道
* 輸出: 無(wú)
* 備注: 無(wú)
********************************************************************************************************/
void Driver_ADCKick(u8 Channel)
{
//匹配通道
ADC_CSR = (ADC_CSR&0xf8)|Channel;
//使能檢測(cè)
ADC_CR1 |= SETBIT0;
}
/********************************************************************************************************
* Function: Driver_ADCGet
* Object: 讀ADC檢測(cè)值 10位長(zhǎng)
* 輸入: ADC值存放指針
* 輸出: 1 轉(zhuǎn)換成功; 0 等待轉(zhuǎn)換;
* 備注: 0~1023
********************************************************************************************************/
bool Driver_ADCGet(u16 *Value)
{
u8 Temp;
//等待轉(zhuǎn)換
if(!(ADC_CSR&CHSBIT7))
return 0;
//讀AD結(jié)果
*Value = ADC_DRL;
Temp = ADC_DRH;
*Value = (Temp*0x100) + (*Value);
//清轉(zhuǎn)換結(jié)束標(biāo)志
ADC_CSR &= CLRBIT7;
return 1;
}
7:I2C
**********/
void Driver_I2CON(void)
{
//開I2C時(shí)鐘
CLK_PCKENR1 |= SETBIT0;
//I2C模式選擇 標(biāo)準(zhǔn)模式
I2C_CCRH &= CLRBIT7;
//設(shè)置輸入時(shí)鐘fck 標(biāo)準(zhǔn)模式>1M(配置2M)
I2C_FREQR = 0x02;
//則標(biāo)準(zhǔn)(fsc為通信速率):
//tck=1/fck=0.5us
//CCR=1/(2fsc*tck) = 1000000/2fsc*0.5 = 1000000/fsc
//按速率設(shè)置宏定義 配置通信速率 10Kbps
I2C_CCRH = 0;
I2C_CCRL = 100;
//配置上升時(shí)間寄存器
I2C_TRISER = 3;
//開啟I2C模塊
I2C_CR1 |= SETBIT0;
}
/********************************************************************************************************
* Function: Driver_I2CSend
* Object: 硬件I2C發(fā)送
* 輸入: 從設(shè)備地址; 待發(fā)送數(shù)據(jù)的頭指針; 待發(fā)數(shù)據(jù)的長(zhǎng);
* 輸出: 無(wú)
* 備注: 通信中如果出現(xiàn)超時(shí)故障 則直接返回 避免長(zhǎng)等待
********************************************************************************************************/
void Driver_I2CSend(u8 Address,u8 *DataBuff,u16 DataLen)
{
u8 temp;
u16 time;
//等待總線空閑
time = 500;
while(I2C_SR3&CHSBIT1)
if(!--time)
return;
//發(fā)起始條件
I2C_CR2 |= SETBIT0;
//等待發(fā)送完畢
time = 500;
while((I2C_SR1&CHSBIT0)==0)
if(!--time)
return;
//短暫延時(shí)
_asm("nop");
_asm("nop");
_asm("nop");
temp = I2C_SR1;
//發(fā)從地址
I2C_DR = Address;
//等待ACK應(yīng)答
time = 500;
while((I2C_SR1&CHSBIT1)==0)
if(!--time)
return;
//短暫延時(shí)
_asm("nop");
_asm("nop");
_asm("nop");
temp = I2C_SR1;
//清ADDR標(biāo)志
temp = I2C_SR3;
//發(fā)送數(shù)據(jù)
for(;DataLen>0;DataLen--,DataBuff++)
{
//等待寄存器為空
time = 500;
while(!(I2C_SR1&CHSBIT7))
if(!--time)
return;
I2C_DR = *DataBuff;
//等待發(fā)送完畢
time = 500;
while(!(I2C_SR1&CHSBIT2))
if(!--time)
return;
_asm("nop");
_asm("nop");
_asm("nop");
}
//發(fā)停止條件,關(guān)閉通信
//清BTF位
temp = I2C_SR1;
temp = I2C_DR;
//發(fā)停止
I2C_CR2 |= SETBIT1;
}
/********************************************************************************************************
* Function: Driver_I2CRecv
* Object: 硬件I2C接收
* 輸入: 從設(shè)備地址;待接收數(shù)據(jù)的頭指針;待接收數(shù)據(jù)的長(zhǎng);
* 輸出: 無(wú)
* 備注: 通信中如果出現(xiàn)超時(shí)故障 則直接返回 避免長(zhǎng)等待
********************************************************************************************************/
void Driver_I2CRecv(u8 Address,u8 *DataBuff,u16 DataLen)
{
u8 temp;
u16 time;
//等待總線空閑
time = 500;
while(I2C_SR3&CHSBIT1)
if(!--time)
return;
//發(fā)起始條件
I2C_CR2 |= SETBIT0;
//等待發(fā)送完畢
time = 500;
while(!(I2C_SR1&CHSBIT0))
if(!--time)
return;
_asm("nop");
_asm("nop");
_asm("nop");
temp = I2C_SR1;
//發(fā)從地址
I2C_DR = Address;
//等待ACK應(yīng)答
time = 500;
while(!(I2C_SR1&CHSBIT1))
if(!--time)
return;
_asm("nop");
_asm("nop");
_asm("nop");
temp = I2C_SR1;
//清ADDR標(biāo)志
temp = I2C_SR3;
//接收數(shù)據(jù),讀DataLen-1個(gè)數(shù)
//使能ACK應(yīng)答
I2C_CR2 |= SETBIT2;
for(;DataLen>1;DataLen--,DataBuff++)
{
//等待寄存器為滿
time = 500;
while(!(I2C_SR1&CHSBIT6))
if(!--time)
return;
*DataBuff = I2C_DR;
}
//關(guān)閉ACK應(yīng)答
I2C_CR2 &= CLRBIT2;
//發(fā)停止條件,關(guān)閉通信
//清BTF位
temp = I2C_SR1;
temp = I2C_DR;
//發(fā)停止
I2C_CR2 |= SETBIT1;
_asm("nop");
_asm("nop");
_asm("nop");
//讀最后一個(gè)數(shù)
time = 500;
while(!(I2C_SR1&CHSBIT6))
if(!--time)
return;
*DataBuff = I2C_DR;
}
8:SPI
* Function: Driver_SPION
* Object: 打開SPI模塊,并執(zhí)行初始化
* 輸入: 無(wú)
* 輸出: 無(wú)
* 備注: 主模式 四線連接 硬件SPI sck mosi misi
/***************************************************************************/
void Driver_SPION(void)
{
//開啟時(shí)鐘
CLK_PCKENR1 |= SETBIT1;
//控制寄存器CR1先清零
SPI_CR1 = 0x00;
//配置通信波特率1Mbps
SPI_CR1 &= 0xC7;
//配置時(shí)鐘的相位與極性
//空閑狀態(tài)時(shí),SCK保持低電平
SPI_CR1 &= CLRBIT1;
//數(shù)據(jù)采樣從第一個(gè)時(shí)鐘邊沿開始
SPI_CR1 &= CLRBIT0;
//定義幀格式
//通信時(shí),串行移位,高位在前,低位在后
SPI_CR1 &= CLRBIT7;
//設(shè)置SPI工作模式
//NSS引腳軟件管理
SPI_CR2 |= SETBIT1;
SPI_CR2 |= SETBIT0;
//主設(shè)備選擇
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發(fā)送數(shù)據(jù)
* 輸入: &DataBuff 發(fā)送數(shù)據(jù)緩存的頭指針;DataLen 發(fā)送數(shù)據(jù)的個(gè)數(shù);
* 輸出: 無(wú)
* 備注: 主模式 四線連接 硬件SPI sck mosi misi
/***************************************************************************/
void Driver_SPISend(u8 *DataBuff,u16 DataLen)
{
u8 temp;
//執(zhí)行發(fā)送
for(;DataLen>0;DataBuff++,DataLen--)
{
//等待發(fā)送
while(!(SPI_SR&CHSBIT1));
//發(fā)送數(shù)據(jù)
SPI_DR = *DataBuff;
}
//等待總線空閑
temp = SPI_DR;
while(SPI_SR&CHSBIT7);
}
/***************************************************************************
* Function: Driver_SPIReceive
* Object: SPI接收數(shù)據(jù)
* 輸入: &DataBuff 接收數(shù)據(jù)緩存的頭指針;DataLen 接收數(shù)據(jù)的個(gè)數(shù);
* 輸出: 無(wú)
* 備注: 主模式 四線連接 硬件SPI sck mosi misi
/***************************************************************************/
void Driver_SPIReceive(u8 *DataBuff,u16 DataLen)
{
//執(zhí)行接收
for(;DataLen>0;DataBuff++,DataLen--)
{
//等待接收
while(!(SPI_SR&CHSBIT0));
//接收數(shù)據(jù)
*DataBuff = SPI_DR;
}
//等待總線空閑
while(SPI_SR&CHSBIT7);
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1