外设的使用
概要:本项目用到了SPI通信和TIM4定时器。这一章将介绍如何使用C语言来调用相应外设,
调用外设分为两部分,一是初始化,二是使用外设。
初始化分为三步
外设时钟初始化-------外设时钟门控寄存器(CLK_PCKENR)---上一章时钟初始化有介绍
外设对应引脚初始化---------GPIO的寄存器 ---上一章引脚初始化有介绍
外设寄存器初始化------------外设的寄存器
使用外设,常使用的寄存器
控制寄存器(CR)
状态寄存器(SR)
数据寄存器(DR)
、、、
TIM4 实现 精准延时
查阅STM8S的参考手册,定时器最常见的使用方法是中断。如下图
本文将 “中断产生” 改成 “原地等待计数器溢出,再执行下一步” ,所以TIM4具体使用情景时
有更新事件
无中断
一次等待越久越好。所以分频系数改最大,自动重装载值(ARR)也可以改最大,设为125,一次延时正好是1ms.
delay_once = ARR*T = ARR*(1/f_cnt) = ARR*(2^PSC[2:0]/f_master)
初始化 TIM4_init()
根据上文TIM4使用情景,以下代码就容易理解了
代码如下:
void TIM4_init(void)
{
TIM4_PSCR=0x07; //2^PSC[2:0] = 2^7
TIM4_EGR=0x01; //无触发事件,有更新事件
TIM4_IER=0x00; //无触发中断和更新中断
TIM4_ARR=125; //ARR=125
TIM4_CNTR=0x00; //CLEAR COUNTER
}
延时函数 delay()
void delay(u16 ms)
{
TIM4_CNTR=0x00; //CLEAR COUNTER
TIM4_CR1|=0x01; //start tim4
while(ms--)
{
while(!(TIM4_SR1&0x01));
TIM4_SR1&=~0x01; //clear overwhelmed bit
}
TIM4_CR1&=~0x01; //stop tim4
}
SPI外设 实现 高速通信
SPI通信 本项目使用的具体情况是,
STM8为主设备
单线(MOSI一根线)单向(master out),只发送不接收
只有一个从设备----->禁止软件从设备管理
不接收,无需中断
初始化 spi_init()
数据手册内有单线双向,只发送的情况下SPI的配置介绍
void spi_init(void)
{
SPI_CR1 = 0x04; //f_baud(主模式频率)=f_master/2
//MSB、8MHz、主设备、CPOL空闲为低、CPHA第一个时钟开始
SPI_CR2 = 0xc0; //
//单线双向、只发送模式、CRC计算禁止、禁止软件NSS
SPI_CR1 |= 0x40; //START SPI
}
SPI通信函数
- 查阅STM8数据手册,SPI通信的注意事项,截图如下
- 因此本项目的SPI通信流程图
- 代码如下
SPI_CR1 |= 0x40; //START SPI
for(j=0;j<n_MBI5043_1_stm8-1;j++)
{
spi_send(dis_buf[ic_map[i*3 + j]]);
}
while(SPI_SR&0x80); // must know spi is not busy,otherwise it is sitll running, stop cmd won't work
SPI_CR1 &= ~(0x40); //STOP SPI
void spi_send(u16 data)
{
while(!(SPI_SR&0x02));
SPI_DR = (u8)(data>>8);
while(!(SPI_SR&0x02));
SPI_DR = (u8)(data);
}