久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
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.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
正在播放国产精品
|
久久青
|
国产日产精品一区二区三区四区
|
国产精品色一区二区三区
|
久久精品视频亚洲
|
在线播放国产一区二区三区
|
欧美日韩一区二区视频在线观看
|
日韩天堂av
|
99精品欧美一区二区蜜桃免费
|
亚洲欧美日韩成人在线
|
日韩国产中文字幕
|
一区二区免费在线视频
|
亚洲一区二区三区在线
|
91精品入口蜜桃
|
国产免费va
|
国产成人精品一区
|
在线欧美
|
综合成人在线
|
青草青草久热精品视频在线观看
|
国产精品视屏
|
日日操网站
|
视频1区
|
国产乱码精品一区二区三区中文
|
91高清在线观看
|
日日人人
|
成人久久久久
|
老外黄色一级片
|
精品久久久久一区二区国产
|
免费精品
|
久久亚洲国产
|
亚洲欧美视频一区
|
精品视频网
|
国产精品久久久久久久久免费桃花
|
免费精品在线视频
|
亚洲精品99
|
狠狠综合久久av一区二区老牛
|
欧美日韩国产一区二区
|
久久久久久久久久久久91
|
波多野吉衣久久
|
caoporn视频在线
|
午夜精品久久久久久久99黑人
|