* Improve uart dma ring buffer. Sending dma still missing
* Add digio module for controlling LEDs, Loudspeaker, and the Digital IOs * General code improvements
This commit is contained in:
		@@ -10,7 +10,7 @@ INCLUDEPATH = -Icmsis -Iinclude
 | 
				
			|||||||
OBJDIR = obj
 | 
					OBJDIR = obj
 | 
				
			||||||
target	= reflow-controller
 | 
					target	= reflow-controller
 | 
				
			||||||
LIBRARYPATH = -L. -Lmathlib
 | 
					LIBRARYPATH = -L. -Lmathlib
 | 
				
			||||||
LIBRARIES = # -larm_cortexM4lf_math
 | 
					LIBRARIES = -larm_cortexM4lf_math
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DEFINES = -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4 -DHSE_VALUE=8000000UL
 | 
					DEFINES = -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4 -DHSE_VALUE=8000000UL
 | 
				
			||||||
mapfile = memory-mapping
 | 
					mapfile = memory-mapping
 | 
				
			||||||
@@ -36,6 +36,10 @@ INCLUDEPATH += -Ishellmatta/api
 | 
				
			|||||||
CFILES += clock-enable-manager.c
 | 
					CFILES += clock-enable-manager.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CFILES += uart/uart.c uart/dma-ring-buffer.c
 | 
					CFILES += uart/uart.c uart/dma-ring-buffer.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CFILES += digio.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEFINES += -DDEBUGBUILD
 | 
				
			||||||
#TODO
 | 
					#TODO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###################################################################################
 | 
					###################################################################################
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ static volatile enum adc_pt1000_error pt1000_error;
 | 
				
			|||||||
static volatile uint8_t * volatile streaming_flag_ptr = NULL;
 | 
					static volatile uint8_t * volatile streaming_flag_ptr = NULL;
 | 
				
			||||||
static uint32_t filter_startup_cnt;
 | 
					static uint32_t filter_startup_cnt;
 | 
				
			||||||
static volatile float adc_pt1000_raw_reading_hf;
 | 
					static volatile float adc_pt1000_raw_reading_hf;
 | 
				
			||||||
 | 
					static volatile bool pt1000_measurement_active = false;
 | 
				
			||||||
static volatile uint16_t dma_sample_buffer[ADC_PT1000_DMA_AVG_SAMPLES];
 | 
					static volatile uint16_t dma_sample_buffer[ADC_PT1000_DMA_AVG_SAMPLES];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ADC_TO_RES(adc) ((float)(adc) / 4096.0f * 2500.0f)
 | 
					#define ADC_TO_RES(adc) ((float)(adc) / 4096.0f * 2500.0f)
 | 
				
			||||||
@@ -49,6 +49,8 @@ static inline void adc_pt1000_disable_adc()
 | 
				
			|||||||
	ADC1->CR2 &= ~ADC_CR2_ADON;
 | 
						ADC1->CR2 &= ~ADC_CR2_ADON;
 | 
				
			||||||
	DMA2_Stream0->CR = 0;
 | 
						DMA2_Stream0->CR = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pt1000_measurement_active = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rcc_manager_disable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(RCC_APB2ENR_ADC1EN));
 | 
						rcc_manager_disable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(RCC_APB2ENR_ADC1EN));
 | 
				
			||||||
	rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(ADC_PT1000_PORT_RCC_MASK));
 | 
						rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(ADC_PT1000_PORT_RCC_MASK));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -139,6 +141,8 @@ void adc_pt1000_setup_meas()
 | 
				
			|||||||
	adc_pt1000_enable_dma_stream();
 | 
						adc_pt1000_enable_dma_stream();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	adc_pt1000_setup_sample_frequency_timer();
 | 
						adc_pt1000_setup_sample_frequency_timer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pt1000_measurement_active = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void adc_pt1000_set_moving_average_filter_param(float alpha)
 | 
					void adc_pt1000_set_moving_average_filter_param(float alpha)
 | 
				
			||||||
@@ -197,12 +201,12 @@ return_value:
 | 
				
			|||||||
	return ret_val;
 | 
						return ret_val;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int adc_pt1000_stream_raw_value_to_memory(uint16_t *adc_array, uint32_t length, volatile uint8_t *flag_to_set)
 | 
					int adc_pt1000_stream_raw_value_to_memory(float *adc_array, uint32_t length, volatile uint8_t *flag_to_set)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void adc_pt1000_convert_raw_value_array_to_resistance(float *resistance_dest, uint16_t *raw_source, uint32_t count)
 | 
					void adc_pt1000_convert_raw_value_array_to_resistance(float *resistance_dest, float *raw_source, uint32_t count)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,7 @@
 | 
				
			|||||||
#include <clock-enable-manager.h>
 | 
					#include <clock-enable-manager.h>
 | 
				
			||||||
 | 
					#include <helper-macros/helper-macros.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct rcc_enable_count {
 | 
					struct rcc_enable_count {
 | 
				
			||||||
	volatile uint32_t *rcc_reg_addr;
 | 
						volatile uint32_t *rcc_reg_addr;
 | 
				
			||||||
	uint32_t enable_bit_cnt;
 | 
						uint32_t enable_bit_cnt;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										120
									
								
								stm-firmware/digio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								stm-firmware/digio.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
				
			|||||||
 | 
					#include <digio.h>
 | 
				
			||||||
 | 
					#include <stm32f4xx.h>
 | 
				
			||||||
 | 
					#include <clock-enable-manager.h>
 | 
				
			||||||
 | 
					#include <stm32-gpio-macros.h>
 | 
				
			||||||
 | 
					#include <helper-macros/helper-macros.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint8_t digio_pins[] = {DIGIO_PINS};
 | 
				
			||||||
 | 
					static const uint8_t digio_default_io[] = {DIGIO_INOUT_DEFAULT};
 | 
				
			||||||
 | 
					static const uint8_t digio_default_altfunc[] = {DIGIO_ALTFUNC_DEFAULT};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void digio_setup_pin_int(uint8_t bit_no, uint8_t in_out, uint8_t alt_func)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DIGIO_PORT->MODER &= MODER_DELETE(bit_no);
 | 
				
			||||||
 | 
						switch (in_out) {
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
 | 
							DIGIO_PORT->MODER |= ALTFUNC(bit_no);
 | 
				
			||||||
 | 
							SETAF(DIGIO_PORT, bit_no, alt_func);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 1:
 | 
				
			||||||
 | 
							DIGIO_PORT->MODER |= OUTPUT(bit_no);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 0: /* expected fallthrough */
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void digio_setup_default_all()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(DIGIO_RCC_MASK));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < COUNT_OF(digio_pins); i++) {
 | 
				
			||||||
 | 
							digio_setup_pin_int(digio_pins[i], digio_default_io[i], digio_default_altfunc[i]);
 | 
				
			||||||
 | 
							if (digio_default_io[i] == 1)
 | 
				
			||||||
 | 
								digio_set(i, 0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void digio_setup_pin(uint8_t num, uint8_t in_out, uint8_t alt_func)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (num >= COUNT_OF(digio_pins))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						digio_setup_pin_int(digio_pins[num], in_out, alt_func);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void digio_set(uint8_t num, int val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (num >= COUNT_OF(digio_pins))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						if (val)
 | 
				
			||||||
 | 
							DIGIO_PORT->ODR |= (1<<digio_pins[num]);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							DIGIO_PORT->ODR &= ~(1<<digio_pins[num]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int digio_get(uint8_t num)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (num >= COUNT_OF(digio_pins))
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((DIGIO_PORT->MODER & (0x3<<digio_pins[num])) == OUTPUT(digio_pins[num]))
 | 
				
			||||||
 | 
							return (DIGIO_PORT->ODR & (1<<digio_pins[num]) ? 1 : 0);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return (DIGIO_PORT->IDR & (1<<digio_pins[num]) ? 1 : 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint8_t led_pins[] = {LED_PINS};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void led_setup()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(LED_RCC_MASK));
 | 
				
			||||||
 | 
						for (i = 0; i < COUNT_OF(led_pins); i++) {
 | 
				
			||||||
 | 
							LED_PORT->MODER &= MODER_DELETE(led_pins[i]);
 | 
				
			||||||
 | 
							LED_PORT->MODER |= OUTPUT(led_pins[i]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void led_set(uint8_t num, int val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (num >= COUNT_OF(led_pins))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						if (val)
 | 
				
			||||||
 | 
							LED_PORT->ODR |= (1<<led_pins[num]);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							LED_PORT->ODR &= ~(1<<led_pins[num]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int led_get(uint8_t num)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (num >= COUNT_OF(led_pins))
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ((LED_PORT->ODR & (1<<led_pins[num])) ? 1 : 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void loudspeaker_setup()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(LOUDSPEAKER_RCC_MASK));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						LOUDSPEAKER_PORT->MODER &= MODER_DELETE(LOUDSPEAKER_PIN);
 | 
				
			||||||
 | 
						LOUDSPEAKER_PORT->MODER |= OUTPUT(LOUDSPEAKER_PIN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						loudspeaker_set(0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					void loudspeaker_set(int val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (val)
 | 
				
			||||||
 | 
							LOUDSPEAKER_PORT->ODR |= (1<<LOUDSPEAKER_PIN);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							LOUDSPEAKER_PORT->ODR &= ~(1<<LOUDSPEAKER_PIN);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					int loudspeaker_get()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return ((LOUDSPEAKER_PORT->ODR & (1<<LOUDSPEAKER_PIN)) ? 1 : 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -111,9 +111,9 @@ int adc_pt1000_get_current_resistance(float *resistance);
 | 
				
			|||||||
 * @param flag_to_set This flag is set to 1 once the data has been measured and is transferred. A negative value indicates an error
 | 
					 * @param flag_to_set This flag is set to 1 once the data has been measured and is transferred. A negative value indicates an error
 | 
				
			||||||
 * @return 0 if measurement could be started
 | 
					 * @return 0 if measurement could be started
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int adc_pt1000_stream_raw_value_to_memory(uint16_t *adc_array, uint32_t length, volatile uint8_t *flag_to_set);
 | 
					int adc_pt1000_stream_raw_value_to_memory(float *adc_array, uint32_t length, volatile uint8_t *flag_to_set);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void adc_pt1000_convert_raw_value_array_to_resistance(float *resistance_dest, uint16_t *raw_source, uint32_t count);
 | 
					void adc_pt1000_convert_raw_value_array_to_resistance(float *resistance_dest, float *raw_source, uint32_t count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief Check if the ADC measurement experienced any kind of error (DMA, Analog Watchdog, etc...)
 | 
					 * @brief Check if the ADC measurement experienced any kind of error (DMA, Analog Watchdog, etc...)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								stm-firmware/include/digio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								stm-firmware/include/digio.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					#ifndef __DIGIO_H__
 | 
				
			||||||
 | 
					#define __DIGIO_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <helper-macros/helper-macros.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DIGIO_PORT GPIOB
 | 
				
			||||||
 | 
					#define DIGIO_RCC_MASK RCC_AHB1ENR_GPIOBEN
 | 
				
			||||||
 | 
					#define DIGIO_PINS 4,5,6,7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUGBUILD
 | 
				
			||||||
 | 
					#define DIGIO_INOUT_DEFAULT 0,0,0,0
 | 
				
			||||||
 | 
					#define DIGIO_ALTFUNC_DEFAULT 0,0,0,0
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define DIGIO_INOUT_DEFAULT 0,0,2,2
 | 
				
			||||||
 | 
					#define DIGIO_ALTFUNC_DEFAULT 0,0,7,7
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BEEPER_PORT GPIOB
 | 
				
			||||||
 | 
					#define BEEPER_RCC_MASK RCC_AHB1ENR_GPIOBEN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void digio_setup_default_all();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void digio_setup_pin(uint8_t num, uint8_t in_out, uint8_t alt_func);
 | 
				
			||||||
 | 
					void digio_set(uint8_t num, int val);
 | 
				
			||||||
 | 
					int digio_get(uint8_t num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LED_PORT GPIOB
 | 
				
			||||||
 | 
					#define LED_RCC_MASK RCC_AHB1ENR_GPIOBEN
 | 
				
			||||||
 | 
					#define LED_PINS 2,3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void led_setup();
 | 
				
			||||||
 | 
					void led_set(uint8_t num, int val);
 | 
				
			||||||
 | 
					int led_get(uint8_t num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LOUDSPEAKER_PORT GPIOB
 | 
				
			||||||
 | 
					#define LOUDSPEAKER_RCC_MASK RCC_AHB1ENR_GPIOBEN
 | 
				
			||||||
 | 
					#define LOUDSPEAKER_PIN 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void loudspeaker_setup();
 | 
				
			||||||
 | 
					void loudspeaker_set(int val);
 | 
				
			||||||
 | 
					int loudspeaker_get();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __DIGIO_H__ */
 | 
				
			||||||
							
								
								
									
										14
									
								
								stm-firmware/include/helper-macros/helper-macros.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								stm-firmware/include/helper-macros/helper-macros.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					#ifndef __HELPER_MACROS_H__
 | 
				
			||||||
 | 
					#define __HELPER_MACROS_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stddef.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define xstr(x) str(x)
 | 
				
			||||||
 | 
					#define str(x) #x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CONCATX(x,y) CONCAT(x,y)
 | 
				
			||||||
 | 
					#define CONCAT(x,y) x##y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __HELPER_MACROS_H__ */
 | 
				
			||||||
@@ -5,19 +5,18 @@
 | 
				
			|||||||
#include <stm32f4xx.h>
 | 
					#include <stm32f4xx.h>
 | 
				
			||||||
#include <stddef.h>
 | 
					#include <stddef.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct dma_ring_buffer {
 | 
					struct dma_ring_buffer_to_mem {
 | 
				
			||||||
	char *data_ptr;
 | 
						void *data_ptr;
 | 
				
			||||||
	size_t buffer_count;
 | 
						size_t buffer_count;
 | 
				
			||||||
	DMA_Stream_TypeDef *dma;
 | 
						DMA_Stream_TypeDef *dma;
 | 
				
			||||||
	size_t get_idx;
 | 
						size_t get_idx;
 | 
				
			||||||
	uint8_t base_dma_id;
 | 
						uint8_t base_dma_id;
 | 
				
			||||||
 | 
						size_t element_size;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int dma_ring_buffer_initialize(struct dma_ring_buffer *dma_buffer, uint8_t base_dma_id, DMA_Stream_TypeDef *dma_stream, size_t buffer_element_count, char *data_buffer, void *src_reg, uint8_t dma_trigger_channel);
 | 
					int dma_ring_buffer_periph_to_mem_initialize(struct dma_ring_buffer_to_mem *dma_buffer, uint8_t base_dma_id, DMA_Stream_TypeDef *dma_stream, size_t buffer_element_count, size_t element_size, void *data_buffer, void *src_reg, uint8_t dma_trigger_channel);
 | 
				
			||||||
int dma_ring_buffer_get_data(struct dma_ring_buffer *buff, const char **data_buff, size_t *len);
 | 
					int dma_ring_buffer_periph_to_mem_get_data(struct dma_ring_buffer_to_mem *buff, const void **data_buff, size_t *len);
 | 
				
			||||||
 | 
					void dma_ring_buffer_periph_to_mem_stop(struct dma_ring_buffer_to_mem *buff);
 | 
				
			||||||
void dma_ring_buffer_stop(struct dma_ring_buffer *buff);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* __DMA_RING_BUFFER_H__ */
 | 
					#endif /* __DMA_RING_BUFFER_H__ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,21 +4,24 @@
 | 
				
			|||||||
#ifndef UART_UART_H_
 | 
					#ifndef UART_UART_H_
 | 
				
			||||||
#define UART_UART_H_
 | 
					#define UART_UART_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define UART_RECEIVE_DMA_STREAM
 | 
					#define UART_RECEIVE_DMA_STREAM DMA2_Stream5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define UART_SEND_DMA_STREAM
 | 
					#define UART_SEND_DMA_STREAM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define UART_PORT_RCC_MASK RCC_AHB1ENR_GPIOAEN
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define UART_PORT GPIOA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define UART_PERIPH USART1
 | 
					#define UART_PERIPH USART1
 | 
				
			||||||
#define UART_RCC_MASK RCC_APB2ENR_USART1EN
 | 
					#define UART_RCC_MASK RCC_APB2ENR_USART1EN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUGBUILD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define UART_PORT GPIOA
 | 
				
			||||||
 | 
					#define UART_PORT_RCC_MASK RCC_AHB1ENR_GPIOAEN
 | 
				
			||||||
#define UART_RX_PIN 10
 | 
					#define UART_RX_PIN 10
 | 
				
			||||||
#define UART_TX_PIN 9
 | 
					#define UART_TX_PIN 9
 | 
				
			||||||
#define UART_RX_PIN_ALTFUNC 7
 | 
					#define UART_RX_PIN_ALTFUNC 7
 | 
				
			||||||
#define UART_TX_PIN_ALTFUNC 7
 | 
					#define UART_TX_PIN_ALTFUNC 7
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* UART_DIV is 45.5625 => 115200 @ 84 MHz */
 | 
					/* UART_DIV is 45.5625 => 115200 @ 84 MHz */
 | 
				
			||||||
#define UART_DIV_FRACTION 9U /* Equals 9/16 = 0.5625 */
 | 
					#define UART_DIV_FRACTION 9U /* Equals 9/16 = 0.5625 */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,7 @@
 | 
				
			|||||||
#include <clock-enable-manager.h>
 | 
					#include <clock-enable-manager.h>
 | 
				
			||||||
#include <uart/uart.h>
 | 
					#include <uart/uart.h>
 | 
				
			||||||
#include <shell.h>
 | 
					#include <shell.h>
 | 
				
			||||||
 | 
					#include <digio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void setup_nvic_priorities()
 | 
					static void setup_nvic_priorities()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -35,18 +36,16 @@ int main()
 | 
				
			|||||||
	size_t uart_input_len;
 | 
						size_t uart_input_len;
 | 
				
			||||||
	shellmatta_handle_t shell_handle;
 | 
						shellmatta_handle_t shell_handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(RCC_AHB1ENR_GPIOBEN));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	__DSB();
 | 
					 | 
				
			||||||
	GPIOB->MODER = OUTPUT(2) | OUTPUT(3);
 | 
					 | 
				
			||||||
	GPIOB->ODR |= (1<<2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	setup_nvic_priorities();
 | 
						setup_nvic_priorities();
 | 
				
			||||||
	systick_setup();
 | 
						systick_setup();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//setup_dma(&adc_results, 3);
 | 
						//setup_dma(&adc_results, 3);
 | 
				
			||||||
	adc_pt1000_setup_meas();
 | 
						adc_pt1000_setup_meas();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						digio_setup_default_all();
 | 
				
			||||||
 | 
						led_setup();
 | 
				
			||||||
 | 
						loudspeaker_setup();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uart_init_with_dma();
 | 
						uart_init_with_dma();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	shell_handle = shell_init();
 | 
						shell_handle = shell_init();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,9 +2,9 @@
 | 
				
			|||||||
#include <uart/uart.h>
 | 
					#include <uart/uart.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <adc-meas.h>
 | 
					#include <adc-meas.h>
 | 
				
			||||||
 | 
					#include <digio.h>
 | 
				
			||||||
#define xstr(x) str(x)
 | 
					#include <stdlib.h>
 | 
				
			||||||
#define str(x) #x
 | 
					#include <helper-macros/helper-macros.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef GIT_VER
 | 
					#ifndef GIT_VER
 | 
				
			||||||
#define GIT_VER "VERSION NOT SET"
 | 
					#define GIT_VER "VERSION NOT SET"
 | 
				
			||||||
@@ -33,6 +33,59 @@ static shellmatta_retCode_t shell_cmd_ver(const shellmatta_handle_t   handle,
 | 
				
			|||||||
	return SHELLMATTA_OK;
 | 
						return SHELLMATTA_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static shellmatta_retCode_t shell_cmd_digio_get(const shellmatta_handle_t   handle,
 | 
				
			||||||
 | 
											 const char                  *arguments,
 | 
				
			||||||
 | 
											 uint32_t                    length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						(void)arguments;
 | 
				
			||||||
 | 
						(void)length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						shellmatta_printf(handle,
 | 
				
			||||||
 | 
									"DIGIO0 DIGIO1 DIGIO2 DIGIO3 LED0 LED1 LS\r\n"
 | 
				
			||||||
 | 
									"%d      %d      %d      %d      %d    %d    %d\r\n",
 | 
				
			||||||
 | 
								  digio_get(0), digio_get(1), digio_get(2), digio_get(3),
 | 
				
			||||||
 | 
								  led_get(0), led_get(1), loudspeaker_get());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return SHELLMATTA_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static shellmatta_retCode_t shell_cmd_digio_set(const shellmatta_handle_t   handle,
 | 
				
			||||||
 | 
											       const char                  *arguments,
 | 
				
			||||||
 | 
											       uint32_t                    length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int num = 100;
 | 
				
			||||||
 | 
						int state;
 | 
				
			||||||
 | 
						(void)length;
 | 
				
			||||||
 | 
						char buff[64];
 | 
				
			||||||
 | 
						char *curr_token;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strncpy(buff, arguments, sizeof(buff));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						curr_token = strtok(buff, " ");
 | 
				
			||||||
 | 
						curr_token = strtok(NULL, " ");
 | 
				
			||||||
 | 
						if (!curr_token)
 | 
				
			||||||
 | 
							return SHELLMATTA_ERROR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						num = atoi(curr_token);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!curr_token)
 | 
				
			||||||
 | 
							return SHELLMATTA_ERROR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						curr_token = strtok(NULL, " ");
 | 
				
			||||||
 | 
						state = atoi(curr_token);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (num < 4 && num >= 0)
 | 
				
			||||||
 | 
							digio_set(num, state);
 | 
				
			||||||
 | 
						else if (num >= 4 && num <= 5)
 | 
				
			||||||
 | 
							led_set(num - 4, state);
 | 
				
			||||||
 | 
						else if (num == 6)
 | 
				
			||||||
 | 
							loudspeaker_set(state);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return SHELLMATTA_ERROR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return SHELLMATTA_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static shellmatta_retCode_t shell_cmd_pt1000_res(const shellmatta_handle_t   handle,
 | 
					static shellmatta_retCode_t shell_cmd_pt1000_res(const shellmatta_handle_t   handle,
 | 
				
			||||||
						 const char                  *arguments,
 | 
											 const char                  *arguments,
 | 
				
			||||||
						 uint32_t length)
 | 
											 uint32_t length)
 | 
				
			||||||
@@ -81,7 +134,7 @@ static shellmatta_retCode_t shell_cmd_clear_error_status(const shellmatta_handle
 | 
				
			|||||||
//    struct shellmatta_cmd   *next;      /**< pointer to next command or NULL        */
 | 
					//    struct shellmatta_cmd   *next;      /**< pointer to next command or NULL        */
 | 
				
			||||||
//} shellmatta_cmd_t;
 | 
					//} shellmatta_cmd_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static shellmatta_cmd_t cmd[3] = {
 | 
					static shellmatta_cmd_t cmd[5] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = "version",
 | 
							.cmd = "version",
 | 
				
			||||||
		.cmdAlias = "ver",
 | 
							.cmdAlias = "ver",
 | 
				
			||||||
@@ -104,6 +157,22 @@ static shellmatta_cmd_t cmd[3] = {
 | 
				
			|||||||
		.helpText = "Clear error status of PT1000 reading",
 | 
							.helpText = "Clear error status of PT1000 reading",
 | 
				
			||||||
		.usageText = NULL,
 | 
							.usageText = NULL,
 | 
				
			||||||
		.cmdFct = shell_cmd_clear_error_status,
 | 
							.cmdFct = shell_cmd_clear_error_status,
 | 
				
			||||||
 | 
							.next = &cmd[3],
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							.cmd = "digio-get",
 | 
				
			||||||
 | 
							.cmdAlias = "dg",
 | 
				
			||||||
 | 
							.helpText = "Read all digital input/output ports",
 | 
				
			||||||
 | 
							.usageText = NULL,
 | 
				
			||||||
 | 
							.cmdFct = shell_cmd_digio_get,
 | 
				
			||||||
 | 
							.next = &cmd[4],
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							.cmd = "digio-set",
 | 
				
			||||||
 | 
							.cmdAlias = "ds",
 | 
				
			||||||
 | 
							.helpText = "Set DIGIO Port",
 | 
				
			||||||
 | 
							.usageText = "digio-set <num> <state>",
 | 
				
			||||||
 | 
							.cmdFct = shell_cmd_digio_set,
 | 
				
			||||||
		.next = NULL,
 | 
							.next = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,6 +36,6 @@ int _read(void) {
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
int _write(int fd, const void *buf, int count) {
 | 
					int _write(int fd, const void *buf, int count) {
 | 
				
			||||||
	sendString((char*)buf, count);
 | 
						uart_send_array((char*)buf, count);
 | 
				
			||||||
	return count;
 | 
						return count;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,33 +1,56 @@
 | 
				
			|||||||
#include <uart/dma-ring-buffer.h>
 | 
					#include <uart/dma-ring-buffer.h>
 | 
				
			||||||
#include <clock-enable-manager.h>
 | 
					#include <clock-enable-manager.h>
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int dma_ring_buffer_initialize(struct dma_ring_buffer *dma_buffer, uint8_t base_dma_id, DMA_Stream_TypeDef *dma_stream, size_t buffer_element_count, char *data_buffer, void* src_reg, uint8_t dma_trigger_channel)
 | 
					static int dma_ring_buffer_switch_clock_enable(uint8_t base_dma, bool clk_en)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						int ret_val;
 | 
				
			||||||
 | 
						int (*clk_func)(volatile uint32_t *, uint8_t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (clk_en)
 | 
				
			||||||
 | 
							clk_func = rcc_manager_enable_clock;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							clk_func = rcc_manager_disable_clock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (base_dma) {
 | 
				
			||||||
 | 
						case 1:
 | 
				
			||||||
 | 
							ret_val = clk_func(&RCC->AHB1ENR, BITMASK_TO_BITNO(RCC_AHB1ENR_DMA1EN));
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
 | 
							ret_val = clk_func(&RCC->AHB1ENR, BITMASK_TO_BITNO(RCC_AHB1ENR_DMA2EN));
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							ret_val = -1000;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret_val;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int dma_ring_buffer_periph_to_mem_initialize(struct dma_ring_buffer_to_mem *dma_buffer, uint8_t base_dma_id,
 | 
				
			||||||
 | 
										     DMA_Stream_TypeDef *dma_stream, size_t buffer_element_count, size_t element_size,
 | 
				
			||||||
 | 
										     void *data_buffer, void* src_reg, uint8_t dma_trigger_channel)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ret_val = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!dma_buffer || !dma_stream || !data_buffer || !src_reg)
 | 
						if (!dma_buffer || !dma_stream || !data_buffer || !src_reg)
 | 
				
			||||||
		return -1;
 | 
							return -1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (dma_trigger_channel > 7)
 | 
						if (dma_trigger_channel > 7)
 | 
				
			||||||
		return -3;
 | 
							return -1007;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dma_buffer->base_dma_id = base_dma_id;
 | 
						dma_buffer->base_dma_id = base_dma_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (base_dma_id) {
 | 
						ret_val = dma_ring_buffer_switch_clock_enable(base_dma_id, true);
 | 
				
			||||||
	case 1:
 | 
						if (ret_val)
 | 
				
			||||||
		rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(RCC_AHB1ENR_DMA1EN));
 | 
							return ret_val;
 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 2:
 | 
					 | 
				
			||||||
		rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(RCC_AHB1ENR_DMA2EN));
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return -2;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dma_buffer->dma = dma_stream;
 | 
						dma_buffer->dma = dma_stream;
 | 
				
			||||||
	dma_buffer->get_idx = 0;
 | 
						dma_buffer->get_idx = 0;
 | 
				
			||||||
	dma_buffer->buffer_count = buffer_element_count;
 | 
						dma_buffer->buffer_count = buffer_element_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dma_buffer->data_ptr = data_buffer;
 | 
						dma_buffer->data_ptr = data_buffer;
 | 
				
			||||||
 | 
						dma_buffer->element_size = element_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dma_stream->PAR = (uint32_t)src_reg;
 | 
						dma_stream->PAR = (uint32_t)src_reg;
 | 
				
			||||||
	dma_stream->M0AR = (uint32_t)data_buffer;
 | 
						dma_stream->M0AR = (uint32_t)data_buffer;
 | 
				
			||||||
@@ -39,7 +62,7 @@ int dma_ring_buffer_initialize(struct dma_ring_buffer *dma_buffer, uint8_t base_
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int dma_ring_buffer_get_data(struct dma_ring_buffer *buff, const char **data_buff, size_t *len)
 | 
					int dma_ring_buffer_periph_to_mem_get_data(struct dma_ring_buffer_to_mem *buff, const void **data_buff, size_t *len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ret_code = 0;
 | 
						int ret_code = 0;
 | 
				
			||||||
	uint32_t ndtr;
 | 
						uint32_t ndtr;
 | 
				
			||||||
@@ -54,12 +77,12 @@ int dma_ring_buffer_get_data(struct dma_ring_buffer *buff, const char **data_buf
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* Check if wrap around */
 | 
						/* Check if wrap around */
 | 
				
			||||||
	if (put_idx < buff->get_idx) {
 | 
						if (put_idx < buff->get_idx) {
 | 
				
			||||||
		*data_buff = &(buff->data_ptr[buff->get_idx]);
 | 
							*data_buff = &(((char *)buff->data_ptr)[buff->get_idx * buff->element_size]);
 | 
				
			||||||
		*len = buff->buffer_count - buff->get_idx;
 | 
							*len = buff->buffer_count - buff->get_idx;
 | 
				
			||||||
		buff->get_idx = 0;
 | 
							buff->get_idx = 0;
 | 
				
			||||||
		ret_code = 1;
 | 
							ret_code = 1;
 | 
				
			||||||
	} else if (put_idx > buff->get_idx) {
 | 
						} else if (put_idx > buff->get_idx) {
 | 
				
			||||||
		*data_buff = &(buff->data_ptr[buff->get_idx]);
 | 
							*data_buff = &(((char *)buff->data_ptr)[buff->get_idx * buff->element_size]);
 | 
				
			||||||
		*len = put_idx - buff->get_idx;
 | 
							*len = put_idx - buff->get_idx;
 | 
				
			||||||
		buff->get_idx += *len;
 | 
							buff->get_idx += *len;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
@@ -70,7 +93,7 @@ int dma_ring_buffer_get_data(struct dma_ring_buffer *buff, const char **data_buf
 | 
				
			|||||||
	return ret_code;
 | 
						return ret_code;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void dma_ring_buffer_stop(struct dma_ring_buffer *buff)
 | 
					void dma_ring_buffer_periph_to_mem_stop(struct dma_ring_buffer_to_mem *buff)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!buff || !buff->dma)
 | 
						if (!buff || !buff->dma)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
@@ -80,14 +103,5 @@ void dma_ring_buffer_stop(struct dma_ring_buffer *buff)
 | 
				
			|||||||
	buff->dma->M1AR = 0;
 | 
						buff->dma->M1AR = 0;
 | 
				
			||||||
	buff->dma->FCR = 0;
 | 
						buff->dma->FCR = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (buff->base_dma_id) {
 | 
						dma_ring_buffer_switch_clock_enable(buff->base_dma_id, false);
 | 
				
			||||||
	case 1:
 | 
					 | 
				
			||||||
		rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(RCC_AHB1ENR_DMA1EN));
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 2:
 | 
					 | 
				
			||||||
		rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(RCC_AHB1ENR_DMA2EN));
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,42 +14,11 @@
 | 
				
			|||||||
#include <stm32-gpio-macros.h>
 | 
					#include <stm32-gpio-macros.h>
 | 
				
			||||||
#include <uart/dma-ring-buffer.h>
 | 
					#include <uart/dma-ring-buffer.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct dma_ring_buffer ring_buff;
 | 
					static struct dma_ring_buffer_to_mem ring_buff_rx;
 | 
				
			||||||
static char uart_rx_buffer[64];
 | 
					static char uart_rx_buffer[64];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void initUART() {
 | 
					 | 
				
			||||||
	__DSB();
 | 
					 | 
				
			||||||
	RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
 | 
					 | 
				
			||||||
	RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
 | 
					 | 
				
			||||||
	__DSB();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	GPIOA->MODER |= (1<<5);
 | 
					 | 
				
			||||||
	GPIOA->AFR[0] |= (7<<8); //Enable Clock
 | 
					 | 
				
			||||||
	GPIOA->MODER |= (1<<5);
 | 
					 | 
				
			||||||
	GPIOA->AFR[0] |= (7<<8);
 | 
					 | 
				
			||||||
	asm("nop");
 | 
					 | 
				
			||||||
	asm("nop");
 | 
					 | 
				
			||||||
	asm("nop");
 | 
					 | 
				
			||||||
	USART2->BRR = 0x1117; //Baudrate  273.4375=>0x1117 9600baud bei 42MHz Periph
 | 
					 | 
				
			||||||
	USART2->CR1 = USART_CR1_UE | USART_CR1_TE;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void sendChar(char c) {
 | 
					 | 
				
			||||||
	while(!(USART2->SR & USART_SR_TXE));
 | 
					 | 
				
			||||||
	USART2->DR = c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
void sendString(char* s, int count) {
 | 
					 | 
				
			||||||
	int i = 0;
 | 
					 | 
				
			||||||
	for (i = 0; i < count; i++,s++)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (!(*s))
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		sendChar(*s);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUGBUILD
 | 
				
			||||||
static inline void uart_gpio_config()
 | 
					static inline void uart_gpio_config()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(UART_PORT_RCC_MASK));
 | 
						rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(UART_PORT_RCC_MASK));
 | 
				
			||||||
@@ -58,17 +27,20 @@ static inline void uart_gpio_config()
 | 
				
			|||||||
	SETAF(UART_PORT, UART_RX_PIN, UART_RX_PIN_ALTFUNC);
 | 
						SETAF(UART_PORT, UART_RX_PIN, UART_RX_PIN_ALTFUNC);
 | 
				
			||||||
	SETAF(UART_PORT, UART_TX_PIN, UART_TX_PIN_ALTFUNC);
 | 
						SETAF(UART_PORT, UART_TX_PIN, UART_TX_PIN_ALTFUNC);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void uart_init_with_dma()
 | 
					void uart_init_with_dma()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	rcc_manager_enable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(UART_RCC_MASK));
 | 
						rcc_manager_enable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(UART_RCC_MASK));
 | 
				
			||||||
 | 
					#ifdef DEBUGBUILD
 | 
				
			||||||
	uart_gpio_config();
 | 
						uart_gpio_config();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	UART_PERIPH->BRR = UART_BRR_REG_VALUE;
 | 
						UART_PERIPH->BRR = UART_BRR_REG_VALUE;
 | 
				
			||||||
	UART_PERIPH->CR3 = USART_CR3_DMAR | USART_CR3_DMAT;
 | 
						UART_PERIPH->CR3 = USART_CR3_DMAR | USART_CR3_DMAT;
 | 
				
			||||||
	UART_PERIPH->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
 | 
						UART_PERIPH->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dma_ring_buffer_initialize(&ring_buff, 2, DMA2_Stream5, sizeof(uart_rx_buffer), uart_rx_buffer, (char *)&UART_PERIPH->DR, 4);
 | 
						dma_ring_buffer_periph_to_mem_initialize(&ring_buff_rx, 2, UART_RECEIVE_DMA_STREAM, sizeof(uart_rx_buffer), 1U,
 | 
				
			||||||
 | 
											 uart_rx_buffer, (char *)&UART_PERIPH->DR, 4);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void uart_disable()
 | 
					void uart_disable()
 | 
				
			||||||
@@ -76,7 +48,7 @@ void uart_disable()
 | 
				
			|||||||
	UART_PERIPH->CR1 = 0;
 | 
						UART_PERIPH->CR1 = 0;
 | 
				
			||||||
	UART_PERIPH->CR2 = 0;
 | 
						UART_PERIPH->CR2 = 0;
 | 
				
			||||||
	UART_PERIPH->CR3 = 0;
 | 
						UART_PERIPH->CR3 = 0;
 | 
				
			||||||
	dma_ring_buffer_stop(&ring_buff);
 | 
						dma_ring_buffer_periph_to_mem_stop(&ring_buff_rx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(UART_PORT_RCC_MASK));
 | 
						rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(UART_PORT_RCC_MASK));
 | 
				
			||||||
	rcc_manager_disable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(UART_RCC_MASK));
 | 
						rcc_manager_disable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(UART_RCC_MASK));
 | 
				
			||||||
@@ -110,5 +82,5 @@ void uart_send_string_with_dma(char *string);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int uart_receive_data_with_dma(const char **data, size_t *len)
 | 
					int uart_receive_data_with_dma(const char **data, size_t *len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return dma_ring_buffer_get_data(&ring_buff, data, len);
 | 
						return dma_ring_buffer_periph_to_mem_get_data(&ring_buff_rx, (const void **)data, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user