Audio.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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. int cntMeiTiao;
  14. OS_ID idBeepTimer;
  15. OS_ID idRingTimer;
  16. /*****************************************************************
  17. *CLK=12Mhz
  18. *(10000,2)==> 12000000/2/10000=600Hz
  19. ******************************************************************/
  20. void BeepInit(void)
  21. {
  22. #if 1
  23. GPIO_InitTypeDef GPIO_InitStructure;
  24. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
  25. //设置该引脚为复用输出功能,输出TIM4 CH2的PWM脉冲波形 GPIOB.7
  26. GPIO_InitStructure.GPIO_Pin = BEEP_PIN; //TIM_CH2
  27. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  28. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  29. GPIO_Init(BEEP_PORT, &GPIO_InitStructure);//初始化GPIO
  30. #else
  31. GPIO_InitTypeDef GPIO_InitStructure;
  32. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  33. TIM_OCInitTypeDef TIM_OCInitStructure;
  34. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能定时器4时钟
  35. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
  36. //设置该引脚为复用输出功能,输出TIM4 CH2的PWM脉冲波形 GPIOB.7
  37. GPIO_InitStructure.GPIO_Pin = BEEP_PIN; //TIM_CH2
  38. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  39. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  40. GPIO_Init(BEEP_PORT, &GPIO_InitStructure);//初始化GPIO
  41. RunMake(THIS_FILE_ID);
  42. /*====== 初始化TIM4 ======*/
  43. TIM_TimeBaseStructure.TIM_Period = 10000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  44. TIM_TimeBaseStructure.TIM_Prescaler =3; //设置用来作为TIMx时钟频率除数的预分频值
  45. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  46. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  47. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比
  48. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  49. //====== 初始化TIM4 Channel2 PWM模式 ======/
  50. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  51. TIM_OCInitStructure.TIM_Pulse=5000; //设置占空比时
  52. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  53. //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  54. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
  55. TIM_OC2Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
  56. TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  57. // TIM_Cmd(TIM4, ENABLE); //禁止/使能TIM4
  58. #endif
  59. RunMake(THIS_FILE_ID);
  60. idBeepTimer=NULL;
  61. }
  62. //Tout= ((arr+1)*(psc+1))/Tclk;
  63. void newBeepSet(int fre)
  64. {
  65. int cntMeiTiao;
  66. uint16_t TimerPeriod,ChannelPulse = 0;
  67. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  68. TIM_OCInitTypeDef TIM_OCInitStructure;
  69. #if(USER_MAIN_SYSCLK==32000000)
  70. cntMeiTiao=7000;
  71. #elif(USER_MAIN_SYSCLK==40000000)
  72. cntMeiTiao=9000;
  73. #elif(USER_MAIN_SYSCLK==48000000)
  74. cntMeiTiao=10800;//OK
  75. ////#elif(SystemCoreClock==56000000)
  76. //// cntMeiTiao=6900
  77. ////#elif(SystemCoreClock==64000000)
  78. //// cntMeiTiao=6900
  79. ////#elif(SystemCoreClock==72000000)
  80. //// cntMeiTiao=6900
  81. #else
  82. cntMeiTiao=0;
  83. #endif
  84. TimerPeriod = (SystemCoreClock / fre ) + cntMeiTiao;
  85. ChannelPulse = (uint16_t) (TimerPeriod/2);
  86. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
  87. TIM_TimeBaseStructure.TIM_Prescaler = 0;
  88. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  89. TIM_TimeBaseStructure.TIM_Period=TimerPeriod;
  90. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  91. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  92. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
  93. TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
  94. TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  95. TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
  96. TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
  97. TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
  98. TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
  99. TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
  100. TIM_OCInitStructure.TIM_Pulse=ChannelPulse;
  101. TIM_OC2Init(TIM5, &TIM_OCInitStructure);
  102. TIM_Cmd(TIM5, ENABLE);
  103. TIM_CtrlPWMOutputs(TIM5,ENABLE);
  104. }
  105. void SetBeep(int fre,int tick)
  106. {
  107. if(strcmp(sutProductPara.Keysound,"close")==0) {
  108. SpeakerDisable();
  109. return;
  110. }
  111. #if 1
  112. newBeepSet(fre);
  113. idBeepTimer=os_tmr_create(tick,TMR_INF_BEEP);
  114. idBeepTimer=os_tmr_create(tick+8,TMR_INF_MIC);//添加一个延时
  115. #else
  116. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  117. TIM_OCInitTypeDef TIM_OCInitStructure;
  118. unsigned short arr;
  119. arr=20000000/fre;//6000000
  120. /*====== 初始化TIM4 ======*/
  121. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  122. TIM_TimeBaseStructure.TIM_Prescaler =3; //设置用来作为TIMx时钟频率除数的预分频值
  123. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  124. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  125. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比
  126. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  127. //====== 初始化TIM4 Channel2 PWM模式 ======/
  128. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  129. TIM_OCInitStructure.TIM_Pulse=arr/2; //设置占空比时
  130. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  131. //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  132. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
  133. TIM_OC1Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
  134. TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  135. #if 0
  136. //SpeakerEnable();
  137. TIM_Cmd(TIM5, ENABLE); //禁止/使能TIM4
  138. os_dly_wait(tick);
  139. TIM_Cmd(TIM5, DISABLE); //禁止/使能TIM4
  140. //SpeakerDisable();
  141. #else
  142. //SpeakerEnable();
  143. //RunMake(THIS_FILE_ID);
  144. TIM_Cmd(TIM5, ENABLE); //禁止/使能TIM4
  145. idBeepTimer=os_tmr_create(tick,TMR_INF_BEEP);
  146. idBeepTimer=os_tmr_create(tick+8,TMR_INF_MIC);//添加一个延时
  147. //RunMake(THIS_FILE_ID);
  148. //SlwTrace(INF,"os_tmr_create\r\n");
  149. //printf("[Beep%ul]\r\n",os_time_get());
  150. #endif
  151. #endif
  152. }
  153. /**********************************************************************
  154. 1ms在8000~9000之间
  155. ***********************************************************************/
  156. //void DelayMs(unsigned short ms)
  157. //{
  158. // unsigned short i;
  159. // unsigned short t=ms;
  160. // RunMake(THIS_FILE_ID);
  161. // IWDG_ReloadCounter();
  162. // while(t--){
  163. // for(i=0;i<6000;i++);
  164. // IWDG_ReloadCounter();
  165. // }
  166. // RunMake(THIS_FILE_ID);
  167. //}
  168. void SetBeepByNoOS(int fre,int ms)
  169. {
  170. if(strcmp(sutProductPara.Keysound,"close")==0) return;
  171. #if 1
  172. newBeepSet(fre);
  173. #else
  174. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  175. TIM_OCInitTypeDef TIM_OCInitStructure;
  176. unsigned short arr;
  177. RunMake(THIS_FILE_ID);
  178. arr=20000000/fre;//6000000
  179. /*====== 初始化TIM4 ======*/
  180. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  181. TIM_TimeBaseStructure.TIM_Prescaler =3; //设置用来作为TIMx时钟频率除数的预分频值
  182. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  183. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  184. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比
  185. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  186. RunMake(THIS_FILE_ID);
  187. //====== 初始化TIM4 Channel2 PWM模式 ======/
  188. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  189. TIM_OCInitStructure.TIM_Pulse=arr/2; //设置占空比时
  190. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  191. //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  192. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
  193. TIM_OC2Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
  194. TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  195. #endif
  196. RunMake(THIS_FILE_ID);
  197. TIM_Cmd(TIM5, ENABLE); //禁止/使能TIM4
  198. DelayMs(ms);
  199. TIM_Cmd(TIM5, DISABLE); //禁止/使能TIM4
  200. }
  201. /********************************************************************************
  202. MicCtrlInit
  203. *********************************************************************************/
  204. void MicrophoneInit(void)
  205. {
  206. GPIO_InitTypeDef GPIO_InitStructure;
  207. GPIO_InitStructure.GPIO_Pin = MIC_MUTE_PIN; //TIM_CH2
  208. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
  209. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  210. GPIO_Init(MIC_MUTE_PORT, &GPIO_InitStructure);//初始化GPIO
  211. MicrophoneCtrl(0);
  212. RunMake(THIS_FILE_ID);
  213. }
  214. /********************************************************************************
  215. MicCtrl
  216. *********************************************************************************/
  217. void MicrophoneCtrl(int en)
  218. {
  219. if(en){
  220. MIC_MUTE_PORT->BRR=MIC_MUTE_PIN;//Set Pin Low ,MIC Enalbe
  221. }else{
  222. MIC_MUTE_PORT->BSRR=MIC_MUTE_PIN;//Set Pin High ,MIC MUTE
  223. }
  224. }
  225. /********************************************************************************
  226. SpeakerInit
  227. *********************************************************************************/
  228. void SpeakerInit(void)
  229. {
  230. GPIO_InitTypeDef GPIO_InitStructure;
  231. GPIO_InitStructure.GPIO_Pin = SPK_MUTE_PIN;
  232. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
  233. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  234. GPIO_Init(SPK_MUTE_PORT, &GPIO_InitStructure);//初始化GPIO
  235. SpeakerCtrl(0);
  236. }
  237. /********************************************************************************
  238. SpeakerCtrl
  239. *********************************************************************************/
  240. void SpeakerCtrl(int en)
  241. {
  242. if(en){
  243. //SPK_MUTE_PORT->BRR=SPK_MUTE_PIN;//Speaker Enable
  244. SpeakerEnable();
  245. }else{
  246. //SPK_MUTE_PORT->BSRR=SPK_MUTE_PIN;//Speaker Disable
  247. SpeakerDisable();
  248. }
  249. }
  250. void SetRingFreq(int fre)
  251. {
  252. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  253. TIM_OCInitTypeDef TIM_OCInitStructure;
  254. unsigned short arr;
  255. arr=20000000/fre;//6000000
  256. /*====== 初始化TIM4 ======*/
  257. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  258. TIM_TimeBaseStructure.TIM_Prescaler =3; //设置用来作为TIMx时钟频率除数的预分频值
  259. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  260. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  261. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比
  262. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  263. //====== 初始化TIM4 Channel2 PWM模式 ======/
  264. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  265. TIM_OCInitStructure.TIM_Pulse=arr/2; //设置占空比时
  266. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  267. //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  268. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
  269. TIM_OC1Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
  270. TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  271. TIM_Cmd(TIM5, ENABLE); //禁止/使能TIM4
  272. }
  273. const SUT_RING_ELEMENT acusRingStart[]={
  274. //频率,时间
  275. {800,100},
  276. {0,100},
  277. {900,100},
  278. {900,150},
  279. {0,200},
  280. {500,300},
  281. {0,0}//必须以{x,0}作为结束
  282. };
  283. SUT_RING sutRing={0,0,0,0};
  284. void RingStart(SUT_RING_ELEMENT *pRingElement)
  285. {
  286. unsigned short freq,time,num;
  287. num=0;
  288. while(1){
  289. time=pRingElement[num].time;
  290. if(time==0)break;
  291. if(++num>10000)return;//不能太长,太长判断为非法而不处理
  292. }
  293. sutRing.pElement=pRingElement;
  294. sutRing.start=1;
  295. sutRing.handle=0;
  296. freq=sutRing.pElement->freq;
  297. time=sutRing.pElement->time;
  298. SetRingFreq(freq);
  299. idRingTimer=os_tmr_create(time,TMR_INF_RING);
  300. SpeakerDisable();
  301. }
  302. /********************************************************************************
  303. * End of Module
  304. *******************************************************************************/