Audio.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /*******************************************************************************
  2. * File Name: Audio.c
  3. * Function Describe:device for the audio
  4. * Relate Module:
  5. * Explain: Hardware version is HS120
  6. * Writer: ShiLiangWen
  7. * Date: 2015.6.15
  8. *******************************************************************************/
  9. #define THIS_FILE_ID 7
  10. //------------------------------------------------------------------------------
  11. #include "stm32f10x.h"
  12. #include <includes.h>
  13. OS_ID idBeepTimer;
  14. OS_ID idRingTimer;
  15. /*****************************************************************
  16. *CLK=12Mhz
  17. *(10000,2)==> 12000000/2/10000=600Hz
  18. ******************************************************************/
  19. void BeepInit(void)
  20. {
  21. GPIO_InitTypeDef GPIO_InitStructure;
  22. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  23. TIM_OCInitTypeDef TIM_OCInitStructure;
  24. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能定时器4时钟
  25. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
  26. //设置该引脚为复用输出功能,输出TIM4 CH2的PWM脉冲波形 GPIOB.7
  27. GPIO_InitStructure.GPIO_Pin = BEEP_PIN; //TIM_CH2
  28. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  29. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30. GPIO_Init(BEEP_PORT, &GPIO_InitStructure);//初始化GPIO
  31. RunMake(THIS_FILE_ID);
  32. /*====== 初始化TIM4 ======*/
  33. TIM_TimeBaseStructure.TIM_Period = 10000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  34. TIM_TimeBaseStructure.TIM_Prescaler =3; //设置用来作为TIMx时钟频率除数的预分频值
  35. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  36. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  37. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比
  38. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  39. //====== 初始化TIM4 Channel2 PWM模式 ======/
  40. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  41. TIM_OCInitStructure.TIM_Pulse=5000; //设置占空比时
  42. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  43. //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  44. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
  45. TIM_OC2Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
  46. TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  47. // TIM_Cmd(TIM4, ENABLE); //禁止/使能TIM4
  48. RunMake(THIS_FILE_ID);
  49. idBeepTimer=NULL;
  50. }
  51. void SetBeep(int fre,int tick)
  52. {
  53. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  54. TIM_OCInitTypeDef TIM_OCInitStructure;
  55. unsigned short arr;
  56. arr=20000000/fre;//6000000
  57. /*====== 初始化TIM4 ======*/
  58. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  59. TIM_TimeBaseStructure.TIM_Prescaler =3; //设置用来作为TIMx时钟频率除数的预分频值
  60. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  61. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  62. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比
  63. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  64. //====== 初始化TIM4 Channel2 PWM模式 ======/
  65. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  66. TIM_OCInitStructure.TIM_Pulse=arr/2; //设置占空比时
  67. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  68. //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  69. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
  70. TIM_OC1Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
  71. TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  72. #if 0
  73. //SpeakerEnable();
  74. TIM_Cmd(TIM5, ENABLE); //禁止/使能TIM4
  75. os_dly_wait(tick);
  76. TIM_Cmd(TIM5, DISABLE); //禁止/使能TIM4
  77. //SpeakerDisable();
  78. #else
  79. //SpeakerEnable();
  80. //RunMake(THIS_FILE_ID);
  81. TIM_Cmd(TIM5, ENABLE); //禁止/使能TIM4
  82. idBeepTimer=os_tmr_create(tick,TMR_INF_BEEP);
  83. idBeepTimer=os_tmr_create(tick+8,TMR_INF_MIC);//添加一个延时
  84. //RunMake(THIS_FILE_ID);
  85. //SlwTrace(INF,"os_tmr_create\r\n");
  86. //printf("[Beep%ul]\r\n",os_time_get());
  87. #endif
  88. }
  89. /**********************************************************************
  90. 1ms在8000~9000之间
  91. ***********************************************************************/
  92. //void DelayMs(unsigned short ms)
  93. //{
  94. // unsigned short i;
  95. // unsigned short t=ms;
  96. // RunMake(THIS_FILE_ID);
  97. // IWDG_ReloadCounter();
  98. // while(t--){
  99. // for(i=0;i<6000;i++);
  100. // IWDG_ReloadCounter();
  101. // }
  102. // RunMake(THIS_FILE_ID);
  103. //}
  104. void SetBeepByNoOS(int fre,int ms)
  105. {
  106. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  107. TIM_OCInitTypeDef TIM_OCInitStructure;
  108. unsigned short arr;
  109. RunMake(THIS_FILE_ID);
  110. arr=20000000/fre;//6000000
  111. /*====== 初始化TIM4 ======*/
  112. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  113. TIM_TimeBaseStructure.TIM_Prescaler =3; //设置用来作为TIMx时钟频率除数的预分频值
  114. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  115. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  116. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比
  117. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  118. RunMake(THIS_FILE_ID);
  119. //====== 初始化TIM4 Channel2 PWM模式 ======/
  120. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  121. TIM_OCInitStructure.TIM_Pulse=arr/2; //设置占空比时
  122. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  123. //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  124. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
  125. TIM_OC2Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
  126. TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  127. RunMake(THIS_FILE_ID);
  128. TIM_Cmd(TIM5, ENABLE); //禁止/使能TIM4
  129. DelayMs(ms);
  130. TIM_Cmd(TIM5, DISABLE); //禁止/使能TIM4
  131. }
  132. /********************************************************************************
  133. MicCtrlInit
  134. *********************************************************************************/
  135. void MicrophoneInit(void)
  136. {
  137. GPIO_InitTypeDef GPIO_InitStructure;
  138. GPIO_InitStructure.GPIO_Pin = MIC_MUTE_PIN; //TIM_CH2
  139. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
  140. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  141. GPIO_Init(MIC_MUTE_PORT, &GPIO_InitStructure);//初始化GPIO
  142. MicrophoneCtrl(0);
  143. RunMake(THIS_FILE_ID);
  144. }
  145. /********************************************************************************
  146. MicCtrl
  147. *********************************************************************************/
  148. void MicrophoneCtrl(int en)
  149. {
  150. if(en){
  151. MIC_MUTE_PORT->BRR=MIC_MUTE_PIN;//Set Pin Low ,MIC Enalbe
  152. }else{
  153. MIC_MUTE_PORT->BSRR=MIC_MUTE_PIN;//Set Pin High ,MIC MUTE
  154. }
  155. }
  156. /********************************************************************************
  157. SpeakerInit
  158. *********************************************************************************/
  159. void SpeakerInit(void)
  160. {
  161. GPIO_InitTypeDef GPIO_InitStructure;
  162. GPIO_InitStructure.GPIO_Pin = SPK_MUTE_PIN;
  163. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
  164. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  165. GPIO_Init(SPK_MUTE_PORT, &GPIO_InitStructure);//初始化GPIO
  166. SpeakerCtrl(0);
  167. }
  168. /********************************************************************************
  169. SpeakerCtrl
  170. *********************************************************************************/
  171. void SpeakerCtrl(int en)
  172. {
  173. if(en){
  174. //SPK_MUTE_PORT->BRR=SPK_MUTE_PIN;//Speaker Enable
  175. SpeakerEnable();
  176. }else{
  177. //SPK_MUTE_PORT->BSRR=SPK_MUTE_PIN;//Speaker Disable
  178. SpeakerDisable();
  179. }
  180. }
  181. void SetRingFreq(int fre)
  182. {
  183. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  184. TIM_OCInitTypeDef TIM_OCInitStructure;
  185. unsigned short arr;
  186. arr=20000000/fre;//6000000
  187. /*====== 初始化TIM4 ======*/
  188. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  189. TIM_TimeBaseStructure.TIM_Prescaler =3; //设置用来作为TIMx时钟频率除数的预分频值
  190. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  191. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  192. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比
  193. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  194. //====== 初始化TIM4 Channel2 PWM模式 ======/
  195. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  196. TIM_OCInitStructure.TIM_Pulse=arr/2; //设置占空比时
  197. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  198. //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  199. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
  200. TIM_OC1Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
  201. TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  202. TIM_Cmd(TIM5, ENABLE); //禁止/使能TIM4
  203. }
  204. const SUT_RING_ELEMENT acusRingStart[]={
  205. //频率,时间
  206. {800,100},
  207. {0,100},
  208. {900,100},
  209. {900,150},
  210. {0,200},
  211. {500,300},
  212. {0,0}//必须以{x,0}作为结束
  213. };
  214. SUT_RING sutRing={0,0,0,0};
  215. void RingStart(SUT_RING_ELEMENT *pRingElement)
  216. {
  217. unsigned short freq,time,num;
  218. num=0;
  219. while(1){
  220. time=pRingElement[num].time;
  221. if(time==0)break;
  222. if(++num>10000)return;//不能太长,太长判断为非法而不处理
  223. }
  224. sutRing.pElement=pRingElement;
  225. sutRing.start=1;
  226. sutRing.handle=0;
  227. freq=sutRing.pElement->freq;
  228. time=sutRing.pElement->time;
  229. SetRingFreq(freq);
  230. idRingTimer=os_tmr_create(time,TMR_INF_RING);
  231. SpeakerDisable();
  232. }
  233. /********************************************************************************
  234. * End of Module
  235. *******************************************************************************/