- 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);//先關閉發(fā)送
- UART1_BRR2=BRR2;//設置波特率 先給BRR2賦值在給BRR1賦值
- UART1_BRR1=BRR1;
- UART1_CR1&=~(1<<2);//不使用奇偶校驗
- UART1_CR1&=~(1<<4);//選擇1個起始位 8個數(shù)據(jù)位
- UART1_CR3&=~(1<<4);//選擇1個停止位
- UART1_CR3&=~(1<<5);//選擇1個停止位
- UART1_CR2&=~(1<<6);//不使用發(fā)送中斷
- UART1_CR2|=(1<<5);//使用接收中斷
- UART1_CR1&=~(1<<5);//啟動UART1
- UART1_CR2|=(1<<2);//啟動接收
- UART1_CR2|=(1<<3);//啟動發(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;//關閉所有中斷
- TIM4_PSCR=0x07;//計數(shù)器頻率=16MHZ/2^4;
- TIM4_CNTR=ARR;
- TIM4_ARR=ARR;
- TIM4_EGR|=(1<<0);//產(chǎn)生更新事件
- TIM4_CR1|=(1<<0);//開啟TIM4的計數(shù)器
- 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);//開啟計數(shù)器
- 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);//開啟計數(shù)器
- }
- @far @interrupt void TIM3_IRQHandler(void)
- {
- TIM3_SR1&=CLRBIT(0);
- Time++;
- }
- 5:外部中斷4 //不需要清除中斷標志
- //PA4 上拉輸入
- PA_DDR &= CLRBIT4;
- PA_CR1 |= SETBIT4;
- //下降沿觸發(fā)
- EXTI_CR1 |= SETBIT1;
- EXTI_CR1 &= CLRBIT0;
- //開啟端口中斷
- PA_CR2 |= SETBIT4;
- 6: ADC
- void Driver_ADCON(void)
- {
- //開ADC時鐘
- CLK_PCKENR2 |= SETBIT3;
- //ADC轉(zhuǎn)換結(jié)束中斷禁止
- ADC_CSR = 0x00;
- //數(shù)據(jù)右對齊
- ADC_CR2 |= SETBIT3;
- }
- /********************************************************************************************************
- * Function: Driver_ADCKick
- * Object: ADC通道選擇 執(zhí)行一次ADC
- * 輸入: ADC通道
- * 輸出: 無
- * 備注: 無
- ********************************************************************************************************/
- void Driver_ADCKick(u8 Channel)
- {
- //匹配通道
- ADC_CSR = (ADC_CSR&0xf8)|Channel;
- //使能檢測
- ADC_CR1 |= SETBIT0;
- }
- /********************************************************************************************************
- * Function: Driver_ADCGet
- * Object: 讀ADC檢測值 10位長
- * 輸入: 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é)束標志
- 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發(fā)送
- * 輸入: 從設備地址; 待發(fā)送數(shù)據(jù)的頭指針; 待發(fā)數(shù)據(jù)的長;
- * 輸出: 無
- * 備注: 通信中如果出現(xiàn)超時故障 則直接返回 避免長等待
- ********************************************************************************************************/
- 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;
- //短暫延時
- _asm("nop");
- _asm("nop");
- _asm("nop");
- temp = I2C_SR1;
- //發(fā)從地址
- 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;
- //發(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ā)停止條件,關閉通信
- //清BTF位
- temp = I2C_SR1;
- temp = I2C_DR;
- //發(fā)停止
- I2C_CR2 |= SETBIT1;
- }
- /********************************************************************************************************
- * Function: Driver_I2CRecv
- * Object: 硬件I2C接收
- * 輸入: 從設備地址;待接收數(shù)據(jù)的頭指針;待接收數(shù)據(jù)的長;
- * 輸出: 無
- * 備注: 通信中如果出現(xiàn)超時故障 則直接返回 避免長等待
- ********************************************************************************************************/
- 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應答
- time = 500;
- while(!(I2C_SR1&CHSBIT1))
- if(!--time)
- return;
- _asm("nop");
- _asm("nop");
- _asm("nop");
- temp = I2C_SR1;
- //清ADDR標志
- temp = I2C_SR3;
- //接收數(shù)據(jù),讀DataLen-1個數(shù)
- //使能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;
- //發(fā)停止條件,關閉通信
- //清BTF位
- temp = I2C_SR1;
- temp = I2C_DR;
- //發(fā)停止
- I2C_CR2 |= SETBIT1;
- _asm("nop");
- _asm("nop");
- _asm("nop");
- //讀最后一個數(shù)
- time = 500;
- while(!(I2C_SR1&CHSBIT6))
- if(!--time)
- return;
- *DataBuff = I2C_DR;
- }
- 8:SPI
- * Function: Driver_SPION
- * Object: 打開SPI模塊,并執(zhí)行初始化
- * 輸入: 無
- * 輸出: 無
- * 備注: 主模式 四線連接 硬件SPI sck mosi misi
- /***************************************************************************/
- void Driver_SPION(void)
- {
- //開啟時鐘
- CLK_PCKENR1 |= SETBIT1;
- //控制寄存器CR1先清零
- SPI_CR1 = 0x00;
- //配置通信波特率1Mbps
- SPI_CR1 &= 0xC7;
- //配置時鐘的相位與極性
- //空閑狀態(tài)時,SCK保持低電平
- SPI_CR1 &= CLRBIT1;
- //數(shù)據(jù)采樣從第一個時鐘邊沿開始
- 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發(fā)送數(shù)據(jù)
- * 輸入: &DataBuff 發(fā)送數(shù)據(jù)緩存的頭指針;DataLen 發(fā)送數(shù)據(jù)的個數(shù);
- * 輸出: 無
- * 備注: 主模式 四線連接 硬件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ù)的個數(shù);
- * 輸出: 無
- * 備注: 主模式 四線連接 硬件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);
- }
-
復制代碼
|