久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3737|回復: 0
打印 上一主題 下一主題
收起左側(cè)

STM8S資源模塊配置

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:75926 發(fā)表于 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);//先關閉發(fā)送
  11.     UART1_BRR2=BRR2;//設置波特率 先給BRR2賦值在給BRR1賦值
  12.     UART1_BRR1=BRR1;
  13. UART1_CR1&=~(1<<2);//不使用奇偶校驗
  14.     UART1_CR1&=~(1<<4);//選擇1個起始位 8個數(shù)據(jù)位
  15.     UART1_CR3&=~(1<<4);//選擇1個停止位
  16.     UART1_CR3&=~(1<<5);//選擇1個停止位
  17.     UART1_CR2&=~(1<<6);//不使用發(fā)送中斷
  18.     UART1_CR2|=(1<<5);//使用接收中斷
  19.     UART1_CR1&=~(1<<5);//啟動UART1
  20.     UART1_CR2|=(1<<2);//啟動接收
  21.     UART1_CR2|=(1<<3);//啟動發(fā)送
  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;//計數(shù)器頻率=16MHZ/2^4;
  33.     TIM4_CNTR=ARR;
  34.     TIM4_ARR=ARR;
  35.     TIM4_EGR|=(1<<0);//產(chǎn)生更新事件
  36.     TIM4_CR1|=(1<<0);//開啟TIM4的計數(shù)器
  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);//開啟計數(shù)器
  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);//開啟計數(shù)器
  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. //下降沿觸發(fā)
  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轉(zhuǎn)換結(jié)束中斷禁止
  97. ADC_CSR = 0x00;
  98. //數(shù)據(jù)右對齊
  99. ADC_CR2 |= SETBIT3;
  100. }

  101. /********************************************************************************************************
  102. *  Function: Driver_ADCKick                                                                  
  103. *  Object: ADC通道選擇 執(zhí)行一次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 轉(zhuǎn)換成功; 0 等待轉(zhuǎn)換;                                               
  120. *  備注: 0~1023                                
  121. ********************************************************************************************************/
  122. bool Driver_ADCGet(u16 *Value)
  123. {
  124. u8 Temp;
  125. //等待轉(zhuǎn)換
  126. if(!(ADC_CSR&CHSBIT7))
  127. return 0;
  128. //讀AD結(jié)果
  129. *Value  = ADC_DRL;
  130. Temp = ADC_DRH;
  131. *Value = (Temp*0x100) + (*Value);
  132. //清轉(zhuǎn)換結(jié)束標志
  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發(fā)送
  160. *  輸入: 從設備地址; 待發(fā)送數(shù)據(jù)的頭指針; 待發(fā)數(shù)據(jù)的長;
  161. *  輸出: 無                                             
  162. *  備注:  通信中如果出現(xiàn)超時故障 則直接返回 避免長等待
  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. //發(fā)起始條件
  174. I2C_CR2 |= SETBIT0;
  175. //等待發(fā)送完畢
  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. //發(fā)從地址
  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. //發(fā)送數(shù)據(jù)
  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. //等待發(fā)送完畢
  209. time = 500;
  210. while(!(I2C_SR1&CHSBIT2))
  211. if(!--time)
  212. return;
  213. _asm("nop");
  214. _asm("nop");
  215. _asm("nop");
  216. }
  217. //發(fā)停止條件,關閉通信
  218. //清BTF位
  219. temp = I2C_SR1;
  220. temp = I2C_DR;
  221. //發(fā)停止
  222. I2C_CR2 |= SETBIT1;
  223. }

  224. /********************************************************************************************************
  225. *  Function: Driver_I2CRecv                                                                  
  226. *  Object: 硬件I2C接收
  227. *  輸入: 從設備地址;待接收數(shù)據(jù)的頭指針;待接收數(shù)據(jù)的長;
  228. *  輸出: 無                                    
  229. *  備注:  通信中如果出現(xiàn)超時故障 則直接返回 避免長等待
  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. //發(fā)起始條件
  241. I2C_CR2 |= SETBIT0;
  242. //等待發(fā)送完畢
  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. //發(fā)從地址
  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. //接收數(shù)據(jù),讀DataLen-1個數(shù)
  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. //發(fā)停止條件,關閉通信
  279. //清BTF位
  280. temp = I2C_SR1;
  281. temp = I2C_DR;
  282. //發(fā)停止
  283. I2C_CR2 |= SETBIT1;
  284. _asm("nop");
  285. _asm("nop");
  286. _asm("nop");
  287. //讀最后一個數(shù)
  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模塊,并執(zhí)行初始化                            
  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. //空閑狀態(tài)時,SCK保持低電平
  311. SPI_CR1 &= CLRBIT1;          
  312. //數(shù)據(jù)采樣從第一個時鐘邊沿開始
  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發(fā)送數(shù)據(jù)                            
  337. *  輸入: &DataBuff 發(fā)送數(shù)據(jù)緩存的頭指針;DataLen 發(fā)送數(shù)據(jù)的個數(shù);      
  338. *  輸出: 無                                                       
  339. *  備注: 主模式 四線連接 硬件SPI sck        mosi misi                     
  340. /***************************************************************************/
  341. void Driver_SPISend(u8 *DataBuff,u16 DataLen)
  342. {
  343. u8 temp;
  344. //執(zhí)行發(fā)送
  345. for(;DataLen>0;DataBuff++,DataLen--)
  346. {
  347. //等待發(fā)送
  348. while(!(SPI_SR&CHSBIT1));
  349. //發(fā)送數(shù)據(jù)
  350. SPI_DR = *DataBuff;
  351. }
  352. //等待總線空閑
  353. temp = SPI_DR;
  354. while(SPI_SR&CHSBIT7);
  355. }

  356. /***************************************************************************
  357. *  Function: Driver_SPIReceive                                  
  358. *  Object:  SPI接收數(shù)據(jù)                            
  359. *  輸入: &DataBuff 接收數(shù)據(jù)緩存的頭指針;DataLen 接收數(shù)據(jù)的個數(shù);        
  360. *  輸出: 無                                                       
  361. *  備注: 主模式 四線連接 硬件SPI sck        mosi misi                     
  362. /***************************************************************************/
  363. void Driver_SPIReceive(u8 *DataBuff,u16 DataLen)
  364. {
  365. //執(zhí)行接收
  366. for(;DataLen>0;DataBuff++,DataLen--)
  367. {
  368. //等待接收
  369. while(!(SPI_SR&CHSBIT0));
  370. //接收數(shù)據(jù)
  371. *DataBuff = SPI_DR;
  372. }
  373. //等待總線空閑
  374. while(SPI_SR&CHSBIT7);
  375. }
  376.    
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91国在线观看 | 久久精品久久久 | av一级一片 | 国产亚洲精品一区二区三区 | 成人三级av | 最新国产精品精品视频 | 久久99国产精一区二区三区 | 又黄又色 | 一区二区免费 | 精品久久香蕉国产线看观看亚洲 | 久久r精品 | a欧美| 日韩精品1区2区 | 91久久国产 | 亚洲精品久久久久中文字幕欢迎你 | 欧美在线一区二区三区 | 99亚洲国产精品 | 欧洲一区二区视频 | 亚洲一区二区免费视频 | 国产91丝袜在线熟 | 久久久久国产一区二区三区 | 精品国产精品一区二区夜夜嗨 | 天天操夜夜操 | 国产精品亚洲欧美日韩一区在线 | 国产精品乱码一区二区三区 | 国产精品久久久久9999鸭 | 国产乱码精品一区二区三区忘忧草 | 一区二区三区在线播放视频 | 91精品国产91久久久久久吃药 | 一区二区三区网站 | 国产精品久久久久久久久污网站 | 国产超碰人人爽人人做人人爱 | 国产一区二区三区久久久久久久久 | 中文字幕成人网 | 日本欧美大片 | 精品网站999 | 一区二区免费高清视频 | 久久久久国产精品一区 | 国产精品一区二区欧美 | 能免费看的av | 久草视频2 |