10 #pragma GCC diagnostic ignored "-Wnarrowing"
13 # error "Wrong implementation included for this platform"
16 #if !defined(CH32X035)
17 # error "This CH32 chip is not supported by Mozzi yet. Only CH32X035 is currently supported."
23 extern "C" void TIM1_UP_IRQHandler(
void) __attribute__((interrupt(
"WCH-Interrupt-fast")));
24 extern "C" void ADC1_IRQHandler(
void) __attribute__((interrupt(
"WCH-Interrupt-fast")));
29 static void startAudio() {
31 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
32 NVIC_InitTypeDef NVIC_InitStructure;
34 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
39 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
40 TIM_TimeBaseStructure.TIM_Prescaler = 0;
41 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
42 TIM_TimeBaseStructure.TIM_Period = period;
43 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
44 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
45 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
47 TIM_ClearFlag(TIM1, TIM_FLAG_Update);
48 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
50 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
51 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
52 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
53 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
54 NVIC_Init(&NVIC_InitStructure);
56 TIM_Cmd(TIM1, ENABLE);
57 TIM_CtrlPWMOutputs(TIM1, ENABLE);
60 GPIO_InitTypeDef GPIO_InitStructure;
61 TIM_OCInitTypeDef TIM_OCInitStructure;
64 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
65 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
68 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
69 TIM_TimeBaseStructure.TIM_Period = 255;
70 TIM_TimeBaseStructure.TIM_Prescaler = 0;
71 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
72 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
73 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
76 TIM_OCStructInit(&TIM_OCInitStructure);
77 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
78 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
79 TIM_OCInitStructure.TIM_Pulse = 128;
80 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
83 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
84 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
85 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
86 GPIO_Init(GPIOA, &GPIO_InitStructure);
88 TIM_OC1Init(TIM3, &TIM_OCInitStructure);
89 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
91 #if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_2PIN_PWM)
93 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
94 GPIO_Init(GPIOA, &GPIO_InitStructure);
96 TIM_OC2Init(TIM3, &TIM_OCInitStructure);
97 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
100 TIM_ARRPreloadConfig(TIM3, ENABLE);
103 TIM_Cmd(TIM3, ENABLE);
104 TIM_CtrlPWMOutputs(TIM3, ENABLE);
108 TIM_Cmd(TIM1, DISABLE);
109 TIM_Cmd(TIM3, DISABLE);
112 void MozziRandPrivate::autoSeed() {}
114 #if MOZZI_IS(MOZZI_ANALOG_READ, MOZZI_ANALOG_READ_STANDARD)
117 #define getADCReading() ADC_GetConversionValue(ADC1)
118 #define channelNumToIndex(channel) channel
121 static uint8_t ch32_current_adc_channel = 0;
124 uint8_t adcPinToChannelNum(uint8_t pin) {
125 #if defined(analogPinToChannel)
126 return analogPinToChannel(pin);
130 if (pin >= A0)
return pin - A0;
135 void setupFastAnalogRead(int8_t speed) {
136 ADC_InitTypeDef ADC_InitStructure;
137 NVIC_InitTypeDef NVIC_InitStructure;
140 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
143 if (speed == FASTEST_ADC) {
144 ADC_CLKConfig(ADC1, ADC_CLK_Div4);
145 }
else if (speed == FASTER_ADC) {
146 ADC_CLKConfig(ADC1, ADC_CLK_Div6);
148 ADC_CLKConfig(ADC1, ADC_CLK_Div8);
155 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
156 ADC_InitStructure.ADC_ScanConvMode = DISABLE;
157 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
158 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
159 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
160 ADC_InitStructure.ADC_NbrOfChannel = 1;
161 ADC_Init(ADC1, &ADC_InitStructure);
164 ADC_Cmd(ADC1, ENABLE);
168 NVIC_InitStructure.NVIC_IRQChannel = ADC1_IRQn;
169 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
170 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
171 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
172 NVIC_Init(&NVIC_InitStructure);
175 ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
178 void setupMozziADC(int8_t speed) {
179 setupFastAnalogRead(speed);
182 void adcStartConversion(uint8_t channel) {
183 ch32_current_adc_channel = channel;
187 ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_11Cycles);
190 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
193 void startSecondADCReadOnCurrentChannel() {
195 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
201 #if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PWM)
203 long out = (long)f.l() + MOZZI_AUDIO_BIAS;
204 TIM_SetCompare1(TIM3, (uint16_t)out);
207 #elif MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_2PIN_PWM)
210 long out = (long)f.l() + MOZZI_AUDIO_BIAS;
213 TIM_SetCompare1(TIM3, (uint16_t)(out >> 8));
216 TIM_SetCompare2(TIM3, (uint16_t)(out & 0xFF));
222 extern "C" void TIM1_UP_IRQHandler(
void) {
223 if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) {
224 TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
225 #if (BYPASS_MOZZI_OUTPUT_BUFFER != true)
226 MozziPrivate::defaultAudioOutput();
232 extern "C" void ADC1_IRQHandler(
void) {
233 if(ADC_GetITStatus(ADC1, ADC_IT_EOC) != RESET) {
245 ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
246 MozziPrivate::advanceADCStep();
#define MOZZI_AUDIO_RATE
Defines the audio rate, i.e.
void stopMozzi()
Stops audio and control interrupts and restores the timers to the values they had before Mozzi was st...
This struct encapsulates one frame of mono audio output.