static void gpio_setup(void)
{
+ // Switch JTAG off to free up pins
+ gpio_primary_remap(AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_ON, 0);
+
// PA6 = RS485 TX enable
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO6);
gpio_clear(GPIOA, GPIO6);
gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO10);
// PB0 = bypass LED*
- gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO0);
+ gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_OPENDRAIN, GPIO0);
gpio_set(GPIOB, GPIO0);
// PB1 = IR RC active LED*
- gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO1);
+ gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_OPENDRAIN, GPIO1);
gpio_set(GPIOB, GPIO1);
- // PB6 = TIM3_CH1 fan control opto-coupler
- gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO7);
+ // PB6 = TIM4_CH1 fan control opto-coupler
+ gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO6);
- // PB7 = TIM3_CH2 IR LED
- gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO7);
+ // PB7 = TIM4_CH2 IR LED
+ gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_OPENDRAIN, GPIO7);
// PB10 = TXD3 for RS485
gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO10);
usart_enable(USART1);
}
-#if 0
-
-static bool bypass_active;
-static byte pwm;
+// TIM4 will run on CPU clock, it will overflow with frequency 38 kHz (IR modulation frequency)
+#define T4_CYCLE ((CPU_CLOCK_MHZ * 1000000 + 37999) / 38000)
+#if 0
static void show_temperature(void)
{
debug_putc('#');
debug_printf(" %d", pwm);
debug_puts("\r\n");
}
+#endif
static void pwm_init(void)
{
- timer_set_prescaler(TIM4, 3); // clock = 72 MHz / 2 = 36 MHz
+ timer_set_prescaler(TIM4, 0);
timer_set_mode(TIM4, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
timer_disable_preload(TIM4);
- timer_set_period(TIM4, 255); // PWM frequency = 18 MHz / 256 = 70.3125 kHz FIXME
+ timer_set_period(TIM4, T4_CYCLE - 1);
+
+ // 50% PWM for the IR LED
+ //timer_set_oc_mode(TIM4, TIM_OC2, TIM_OCM_FORCE_HIGH); // will be TIM_OCM_PWM1 when transmitting
+ timer_set_oc_mode(TIM4, TIM_OC2, TIM_OCM_PWM1); // FIXME
+ timer_set_oc_value(TIM4, TIM_OC2, T4_CYCLE / 2);
+ timer_set_oc_polarity_high(TIM4, TIM_OC2);
+ timer_enable_oc_output(TIM4, TIM_OC2);
+
+ // PWM for controlling fan
timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_PWM1);
- timer_set_oc_value(TIM4, TIM_OC1, 1);
- pwm = 1;
- /*
- * 1 0.03
- * 4 0.48
- * 8 1.54
- * 12 2.71
- * 16 3.99
- * 24 6.34
- * 32 7.85
- * 64 7.95
- * 128 8.02
- * 255
- */
+ timer_set_oc_value(TIM4, TIM_OC1, T4_CYCLE * 20 / 256);
timer_set_oc_polarity_high(TIM4, TIM_OC1);
- timer_enable_counter(TIM4);
timer_enable_oc_output(TIM4, TIM_OC1);
- gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO6);
+ timer_enable_counter(TIM4);
}
-#endif
-
int main(void)
{
clock_setup();
gpio_setup();
tick_setup();
usart_setup();
- // pwm_init();
-
- // ds_init();
+ pwm_init();
debug_puts("Hello, world!\n");
+ ds_init();
+
for (;;) {
gpio_toggle(GPIOC, GPIO13);