- 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);
- }
-
复制代码
|