找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3195|回复: 0
收起左侧

STM8S资源模块配置

[复制链接]
ID:75926 发表于 2015-4-10 17:00 | 显示全部楼层 |阅读模式
  1. 1:UART

  2. void UART_Init(void)
  3. {
  4.     #define BRR     9600//定义波特率(修改波特率只需要修改这个宏的值就可以了)
  5.     #define Fosc    16000000  //定义CPU频率
  6.     #define BRR1    (((Fosc)/(BRR))>>4)
  7.     #define BRR2    (((((Fosc)/(BRR))&0xf000)>>8)|(((Fosc)/(BRR))&0x000f))
  8.     CLK_PCKENR1|=1<<2;//开启UART1时钟
  9.     UART1_CR2&=~(1<<2);//先关闭接收
  10.     UART1_CR2&=~(1<<3);//先关闭发送
  11.     UART1_BRR2=BRR2;//设置波特率 先给BRR2赋值在给BRR1赋值
  12.     UART1_BRR1=BRR1;
  13. UART1_CR1&=~(1<<2);//不使用奇偶校验
  14.     UART1_CR1&=~(1<<4);//选择1个起始位 8个数据位
  15.     UART1_CR3&=~(1<<4);//选择1个停止位
  16.     UART1_CR3&=~(1<<5);//选择1个停止位
  17.     UART1_CR2&=~(1<<6);//不使用发送中断
  18.     UART1_CR2|=(1<<5);//使用接收中断
  19.     UART1_CR1&=~(1<<5);//启动UART1
  20.     UART1_CR2|=(1<<2);//启动接收
  21.     UART1_CR2|=(1<<3);//启动发送
  22. }

  23. void UART_SendByte(uint8_t Byte)
  24. {
  25. while(UART1_SR&(1<<7)==0);
  26. UART1_DR=Byte;
  27. }



  28. 2:TIM4
  29.     #define    PERIOD    100
  30.     #define     ARR    ((0xff)-(PERIOD))
  31.     TIM4_IER=0x00;//关闭所有中断
  32.     TIM4_PSCR=0x07;//计数器频率=16MHZ/2^4;
  33.     TIM4_CNTR=ARR;
  34.     TIM4_ARR=ARR;
  35.     TIM4_EGR|=(1<<0);//产生更新事件
  36.     TIM4_CR1|=(1<<0);//开启TIM4的计数器
  37.     TIM4_SR&=~(1<<0);//    清除中断标志
  38.     TIM4_IER|=(1<<0);//       开启更新中断

  39. 3:TIM2
  40. static void TIM2_Configuration(void)
  41. {
  42. #define Period        (1000)
  43. #define ARRH        ((0xffff-Period)&0xff00)
  44. #define ARRL        ((0xffff-Period)&0x00ff)
  45. TIM2_ARRH=ARRH;
  46. TIM2_ARRL=ARRL;
  47. TIM2_PSCR=4;//16MHZ/2^4=1MHZ
  48. TIM2_EGR|=SETBIT(0);//开启更新事件
  49. TIM2_IER|=SETBIT(0);//开启更新中断
  50. //        TIM2_CR1|=SETBIT(0);//开启计数器
  51. TIM2_CR1&=CLRBIT(0);
  52. }
  53. @far @interrupt void TIM2_IRQHandler(void)
  54. {
  55. TIM2_SR1&=CLRBIT(0);//清除中断标志
  56. Time++;
  57. }

  58. 4:PWM

  59. static void TIM3_PWM_Configuration(void)
  60. {
  61. #define Period        (100)
  62. #define ARRL        ((0xffff-Period)&0x00ff)
  63. #define ARRH        ((0xffff-Period)&0xff00)
  64. /* 时间基础设置*/
  65. TIM3_ARRH=0;
  66. TIM3_ARRL=100;
  67. /*PWM*/
  68. TIM3_CCMR1|=0x70;//PWM模式2
  69. TIM3_CCER1|=SETBIT(0);//开启TIM3通道3输出
  70. TIM3_CCR1H=0;//
  71. TIM3_CCR1L=10;//
  72. TIM3_PSCR=4;//分频16/2^4=1
  73. TIM3_EGR|=SETBIT(0);//事件
  74. TIM3_IER|=SETBIT(0);//中断
  75. TIM3_CR1|=SETBIT(0);//开启计数器
  76. }

  77. @far @interrupt void TIM3_IRQHandler(void)
  78. {
  79. TIM3_SR1&=CLRBIT(0);
  80. Time++;
  81. }




  82. 5:外部中断4   //不需要清除中断标志
  83. //PA4 上拉输入
  84. PA_DDR &= CLRBIT4;
  85. PA_CR1 |= SETBIT4;
  86. //下降沿触发
  87. EXTI_CR1 |= SETBIT1;
  88. EXTI_CR1 &= CLRBIT0;
  89. //开启端口中断
  90. PA_CR2 |= SETBIT4;

  91. 6: ADC

  92. void Driver_ADCON(void)
  93. {
  94. //开ADC时钟
  95. CLK_PCKENR2 |= SETBIT3;
  96. //ADC转换结束中断禁止
  97. ADC_CSR = 0x00;
  98. //数据右对齐
  99. ADC_CR2 |= SETBIT3;
  100. }

  101. /********************************************************************************************************
  102. *  Function: Driver_ADCKick                                                                  
  103. *  Object: ADC通道选择 执行一次ADC
  104. *  输入: ADC通道
  105. *  输出: 无                                                                   
  106. *  备注: 无                                 
  107. ********************************************************************************************************/
  108. void Driver_ADCKick(u8 Channel)
  109. {
  110. //匹配通道
  111. ADC_CSR = (ADC_CSR&0xf8)|Channel;
  112. //使能检测
  113. ADC_CR1 |= SETBIT0;
  114. }

  115. /********************************************************************************************************
  116. *  Function: Driver_ADCGet                                                                  
  117. *  Object: 读ADC检测值 10位长
  118. *  输入: ADC值存放指针
  119. *  输出: 1 转换成功; 0 等待转换;                                               
  120. *  备注: 0~1023                                
  121. ********************************************************************************************************/
  122. bool Driver_ADCGet(u16 *Value)
  123. {
  124. u8 Temp;
  125. //等待转换
  126. if(!(ADC_CSR&CHSBIT7))
  127. return 0;
  128. //读AD结果
  129. *Value  = ADC_DRL;
  130. Temp = ADC_DRH;
  131. *Value = (Temp*0x100) + (*Value);
  132. //清转换结束标志
  133. ADC_CSR &= CLRBIT7;
  134. return 1;       
  135. }


  136. 7:I2C
  137. **********/
  138. void Driver_I2CON(void)
  139. {
  140. //开I2C时钟
  141. CLK_PCKENR1 |= SETBIT0;
  142. //I2C模式选择 标准模式
  143. I2C_CCRH &= CLRBIT7;
  144. //设置输入时钟fck 标准模式>1M(配置2M)
  145. I2C_FREQR = 0x02;
  146. //则标准(fsc为通信速率):
  147. //tck=1/fck=0.5us
  148. //CCR=1/(2fsc*tck) = 1000000/2fsc*0.5 = 1000000/fsc
  149. //按速率设置宏定义 配置通信速率 10Kbps
  150. I2C_CCRH = 0;
  151. I2C_CCRL = 100;
  152. //配置上升时间寄存器
  153. I2C_TRISER = 3;
  154. //开启I2C模块
  155. I2C_CR1 |= SETBIT0;
  156. }

  157. /********************************************************************************************************
  158. *  Function: Driver_I2CSend                                                                  
  159. *  Object: 硬件I2C发送
  160. *  输入: 从设备地址; 待发送数据的头指针; 待发数据的长;
  161. *  输出: 无                                             
  162. *  备注:  通信中如果出现超时故障 则直接返回 避免长等待
  163. ********************************************************************************************************/
  164. void Driver_I2CSend(u8 Address,u8 *DataBuff,u16 DataLen)
  165. {         
  166. u8 temp;
  167. u16 time;
  168. //等待总线空闲
  169. time = 500;
  170. while(I2C_SR3&CHSBIT1)       
  171. if(!--time)
  172. return;
  173. //发起始条件
  174. I2C_CR2 |= SETBIT0;
  175. //等待发送完毕
  176. time = 500;
  177. while((I2C_SR1&CHSBIT0)==0)
  178. if(!--time)
  179. return;
  180. //短暂延时
  181. _asm("nop");
  182. _asm("nop");
  183. _asm("nop");
  184. temp = I2C_SR1;
  185. //发从地址
  186. I2C_DR = Address;
  187. //等待ACK应答
  188. time = 500;
  189. while((I2C_SR1&CHSBIT1)==0)
  190. if(!--time)
  191. return;
  192. //短暂延时
  193. _asm("nop");
  194. _asm("nop");
  195. _asm("nop");
  196. temp = I2C_SR1;
  197. //清ADDR标志
  198. temp = I2C_SR3;
  199. //发送数据
  200. for(;DataLen>0;DataLen--,DataBuff++)
  201. {
  202. //等待寄存器为空
  203. time = 500;
  204. while(!(I2C_SR1&CHSBIT7))
  205. if(!--time)
  206. return;
  207. I2C_DR = *DataBuff;
  208. //等待发送完毕
  209. time = 500;
  210. while(!(I2C_SR1&CHSBIT2))
  211. if(!--time)
  212. return;
  213. _asm("nop");
  214. _asm("nop");
  215. _asm("nop");
  216. }
  217. //发停止条件,关闭通信
  218. //清BTF位
  219. temp = I2C_SR1;
  220. temp = I2C_DR;
  221. //发停止
  222. I2C_CR2 |= SETBIT1;
  223. }

  224. /********************************************************************************************************
  225. *  Function: Driver_I2CRecv                                                                  
  226. *  Object: 硬件I2C接收
  227. *  输入: 从设备地址;待接收数据的头指针;待接收数据的长;
  228. *  输出: 无                                    
  229. *  备注:  通信中如果出现超时故障 则直接返回 避免长等待
  230. ********************************************************************************************************/
  231. void Driver_I2CRecv(u8 Address,u8 *DataBuff,u16 DataLen)
  232. {         
  233. u8 temp;
  234. u16 time;
  235. //等待总线空闲
  236. time = 500;
  237. while(I2C_SR3&CHSBIT1)
  238. if(!--time)
  239. return;
  240. //发起始条件
  241. I2C_CR2 |= SETBIT0;
  242. //等待发送完毕
  243. time = 500;
  244. while(!(I2C_SR1&CHSBIT0))
  245. if(!--time)
  246. return;
  247. _asm("nop");
  248. _asm("nop");
  249. _asm("nop");
  250. temp = I2C_SR1;
  251. //发从地址
  252. I2C_DR = Address;
  253. //等待ACK应答
  254. time = 500;
  255. while(!(I2C_SR1&CHSBIT1))
  256. if(!--time)
  257. return;
  258. _asm("nop");
  259. _asm("nop");
  260. _asm("nop");
  261. temp = I2C_SR1;
  262. //清ADDR标志
  263. temp = I2C_SR3;
  264. //接收数据,读DataLen-1个数
  265. //使能ACK应答
  266. I2C_CR2        |= SETBIT2;
  267. for(;DataLen>1;DataLen--,DataBuff++)
  268. {
  269. //等待寄存器为满
  270. time = 500;
  271. while(!(I2C_SR1&CHSBIT6))
  272. if(!--time)
  273. return;
  274. *DataBuff = I2C_DR;
  275. }
  276. //关闭ACK应答
  277. I2C_CR2 &= CLRBIT2;
  278. //发停止条件,关闭通信
  279. //清BTF位
  280. temp = I2C_SR1;
  281. temp = I2C_DR;
  282. //发停止
  283. I2C_CR2 |= SETBIT1;
  284. _asm("nop");
  285. _asm("nop");
  286. _asm("nop");
  287. //读最后一个数
  288. time = 500;
  289. while(!(I2C_SR1&CHSBIT6))
  290. if(!--time)
  291. return;
  292. *DataBuff = I2C_DR;         
  293. }


  294. 8:SPI
  295. *  Function: Driver_SPION                                        
  296. *  Object:  打开SPI模块,并执行初始化                            
  297. *  输入: 无                        
  298. *  输出: 无                                                       
  299. *  备注: 主模式 四线连接 硬件SPI sck        mosi misi                       
  300. /***************************************************************************/
  301. void Driver_SPION(void)
  302. {
  303. //开启时钟
  304. CLK_PCKENR1 |= SETBIT1;
  305. //控制寄存器CR1先清零
  306. SPI_CR1 = 0x00;   
  307. //配置通信波特率1Mbps
  308. SPI_CR1 &= 0xC7;       
  309. //配置时钟的相位与极性
  310. //空闲状态时,SCK保持低电平
  311. SPI_CR1 &= CLRBIT1;          
  312. //数据采样从第一个时钟边沿开始
  313. SPI_CR1 &= CLRBIT0;       
  314. //定义帧格式
  315. //通信时,串行移位,高位在前,低位在后
  316. SPI_CR1 &= CLRBIT7;       
  317. //设置SPI工作模式
  318. //NSS引脚软件管理
  319. SPI_CR2 |= SETBIT1;
  320. SPI_CR2 |= SETBIT0;
  321. //主设备选择
  322. SPI_CR1 |= SETBIT2;
  323. //端口配置为快速摆率
  324. PC_DDR |= SETBIT5;
  325. PC_CR1 |= SETBIT5;
  326. PC_CR2 |= SETBIT5;
  327. PC_DDR |= SETBIT6;
  328. PC_CR1 |= SETBIT6;
  329. PC_CR2 |= SETBIT6;
  330. PC_CR1 |= SETBIT7;       
  331. //使能SPI
  332. SPI_CR1 |= SETBIT6;
  333. }

  334. /***************************************************************************
  335. *  Function: Driver_SPISend                                       
  336. *  Object:  SPI发送数据                            
  337. *  输入: &DataBuff 发送数据缓存的头指针;DataLen 发送数据的个数;      
  338. *  输出: 无                                                       
  339. *  备注: 主模式 四线连接 硬件SPI sck        mosi misi                     
  340. /***************************************************************************/
  341. void Driver_SPISend(u8 *DataBuff,u16 DataLen)
  342. {
  343. u8 temp;
  344. //执行发送
  345. for(;DataLen>0;DataBuff++,DataLen--)
  346. {
  347. //等待发送
  348. while(!(SPI_SR&CHSBIT1));
  349. //发送数据
  350. SPI_DR = *DataBuff;
  351. }
  352. //等待总线空闲
  353. temp = SPI_DR;
  354. while(SPI_SR&CHSBIT7);
  355. }

  356. /***************************************************************************
  357. *  Function: Driver_SPIReceive                                  
  358. *  Object:  SPI接收数据                            
  359. *  输入: &DataBuff 接收数据缓存的头指针;DataLen 接收数据的个数;        
  360. *  输出: 无                                                       
  361. *  备注: 主模式 四线连接 硬件SPI sck        mosi misi                     
  362. /***************************************************************************/
  363. void Driver_SPIReceive(u8 *DataBuff,u16 DataLen)
  364. {
  365. //执行接收
  366. for(;DataLen>0;DataBuff++,DataLen--)
  367. {
  368. //等待接收
  369. while(!(SPI_SR&CHSBIT0));
  370. //接收数据
  371. *DataBuff = SPI_DR;
  372. }
  373. //等待总线空闲
  374. while(SPI_SR&CHSBIT7);
  375. }
  376.    
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表