1 /* (CC-BY-NC-SA) ROBIN KRENS - ROBIN @ ROBINKRENS.NL
4 * 2019/8/4 - ROBIN KRENS
18 #include <sys/robsys.h>
20 #include <lib/regfunc.h>
21 #include <lib/string.h>
22 #include <lib/tinyprintf.h>
24 #include <drivers/tsensor.h>
26 #define PRESCALER 8000 // 1 kHz
28 int *ccr1, *ccr2, *ccr1b, *ccr2b;
31 void * update_handler() {
40 if(rchkbit(TIM4_SR1, 1)) {
42 // printf("CCR1: %p\n", *TIM4_CCR1);
43 // printf("CCR2: %p\n", *TIM4_CCR2);
49 if(rchkbit(TIM4_SR1, 2)) {
56 if(rchkbit(TIM4_SR1, 6)) {
57 // printf("TRIGGER\n");
62 // rclrbit(TIM4_SR1, 9); // OF
63 // rclrbit(TIM4_SR1, 10); // OF
65 // TODO clear overflow tag
67 printf("SR1/CCR1: %p\n", ccr1);
68 printf("SR1/CCR2: %p\n", ccr2);
69 printf("SR2/CCR1: %p\n", ccr1b);
70 printf("SR2/CCR2: %p\n", ccr2b);
73 printf("EDGE DOWN\n");
82 rwrite(GPIOB_CRL, 0x44444444);
85 void * tmp_update_handler() {
87 printf("SR: %p\n", *TIM4_SR1);
89 rclrbit(TIM4_CR1, 0); /* EMULATOR STOP */
93 tsensor_input(0xFFFF);
95 // if(rchkbit(TIM4_SR1, 1)) {
101 void * cnt_complete_handler() {
102 rclrbit(TIM4_CR1, 0);
103 rclrbit(TIM4_SR1, 0);
104 rclrbit(TIM4_DIER, 0);
105 rwrite(GPIOB_CRL, 0x44444444);
106 printf("CNT COMPLETE\n");
107 tsensor_input(0xFFFF);
112 void * bare_handler() {
114 printf("Count event %d\n", cnt);
115 int switchled = cnt % 2;
117 printf("setting low\n");
118 rclrbit(GPIOB_ODR, 6); // low
121 printf("setting high\n");
122 rsetbit(GPIOB_ODR, 6); // high
124 rclrbit(TIM4_SR1, 0);
128 void tsensor_simple(uint16_t preload) {
130 rsetbit(RCC_APB1ENR, 2); // TIM4 enable
132 rsetbitsfrom(TIM4_CR1, 5, 0x00); // edge-aligned mode
133 rclrbit(TIM4_CR1, 4); // upcounter (clrbit! not needed to set)
134 rsetbit(TIM4_CR1, 2); // only overflow generates update
136 rwrite(TIM4_PSC, PRESCALER - 1);
137 rwrite(TIM4_ARR, preload);
138 rsetbit(TIM4_EGR, 0);
140 ivt_set_gate(46, bare_handler, 0);
141 rsetbit(NVIC_ISER0, 30); // interupt 41 - 32
143 rsetbit(GPIOB_ODR, 6); //
144 rsetbit(TIM4_DIER, 0);
145 rsetbit(TIM4_CR1, 0);
152 rsetbit(RCC_APB2ENR, 3); // GPIOB enable
153 rwrite(GPIOB_CRL, 0x42444444); // open drain general for sensor?
155 rsetbit(GPIOB_BSRR, 22); // high
157 tsensor_simple(4000); // 2 second?
159 // tsensor_output(580, 520);
161 // tsensor_simple(580);
164 void tsensor_output(uint16_t preload, uint16_t compare/*, uint16_t pulses */) {
167 rsetbit(RCC_APB2ENR, 3); // GPIOB enable
168 rwrite(GPIOB_CRL, 0x4A444444); // PB6 for Channel 1 TIM4 alternate
169 rsetbit(RCC_APB1ENR, 2); // TIM4 enable
171 rsetbitsfrom(TIM4_CR1, 5, 0x00); // edge-aligned mode
172 rclrbit(TIM4_CR1, 4); // upcounter (clrbit! not needed to set)
173 rsetbit(TIM4_CR1, 2); // only overflow generates update
175 rwrite(TIM4_PSC, PRESCALER - 1); // 1 MHz
176 rwrite(TIM4_ARR, preload); // preload
177 rwrite(TIM4_CCR1, compare); // compare
178 //rwrite(TIM4_RCR, pulses - 1); /* repeat ONLY IN ADVANCED TIMER */
180 rsetbit(TIM4_EGR, 0); // update generation
182 rsetbit(TIM4_CR1, 3); // one pulse mode
183 rsetbitsfrom(TIM4_CCMR1, 4, 0x6); // mode
185 //rsetbit(TIM4_CCMR1, 3); // preload enable
186 //rsetbit(TIM4_CR1, 7); // buffered
188 rsetbit(TIM4_CCER, 0); // enable output channeli 1
189 rsetbit(TIM4_CCER, 1); // active low
190 rsetbit(TIM4_CR1, 0); // start counter
193 ivt_set_gate(46, tmp_update_handler, 0);
195 rsetbit(TIM4_DIER, 1);
196 rsetbit(NVIC_ISER0, 30); // interupt 41 - 32
200 void tsensor_input(uint16_t preload) {
202 //uint16_t timestamp;
204 //rsetbit(RCC_APB2ENR, 3); // GPIOB enable
205 //rwrite(GPIOB_CRL, 0x44444444); // Input floating (default state)
206 //rsetbit(RCC_APB1ENR, 2); // TIM4 enable
208 //rsetbitsfrom(TIM4_CR1, 5, 0x00); // edge-aligned mode
209 //rclrbit(TIM4_CR1, 4); // upcounter (clrbit! not needed to set)
211 rwrite(TIM4_PSC, PRESCALER - 1); // 1 MHz
212 rwrite(TIM4_ARR, preload); // preload
215 rsetbit(TIM4_EGR, 0); // update generation
217 rsetbit(TIM4_CCMR1, 0); // input on TI1
218 rsetbit(TIM4_CCMR1, 9); // another input TI2
219 rsetbit(TIM4_CCER, 1); // other polarity for T1, inverted
221 /* TODO: reg funct */
222 rsetbit(TIM4_SMCR, 4); // OLD: 101, new Edge detector
223 rsetbit(TIM4_SMCR, 6); //
226 // rsetbit(TIM4_SMCR, 2); // RESET rising edge triggers counter and generates update
227 rsetbit(TIM4_SMCR, 2); // OLD: 110
228 rsetbit(TIM4_SMCR, 1);
229 rsetbit(TIM4_SMCR, 0);
230 //rsetbit(TIM4_SMCR, 1); // 110
232 //rsetbit(TIM4_CR1, 3); // one pulse mode // NOTE: RESET after finised preload
233 // will catch multiple signal... can set fram
235 rsetbit(TIM4_CCER, 0); // enable capture channel 1 (changed pos)
236 rsetbit(TIM4_CCER, 4); // enable capture channel 2
237 /* Caught on rising edge, no need to change*/
238 /* Clear capture event flag */
239 // rsetbit(TIM4_CR1, 0); // RESET with no trigger mode start
241 // enable capture channel 1 interrupt
242 rsetbit(TIM4_DIER, 1);
243 rsetbit(TIM4_DIER, 2);
244 ivt_set_gate(46, update_handler, 0);
245 rsetbit(NVIC_ISER0, 30);