diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/megametrum-v0.1/Makefile | 6 | ||||
| -rw-r--r-- | src/megametrum-v0.1/ao_megametrum.c | 13 | ||||
| -rw-r--r-- | src/stm/ao_beep_stm.c | 130 | ||||
| -rw-r--r-- | src/stm/stm32l.h | 215 | 
4 files changed, 362 insertions, 2 deletions
| diff --git a/src/megametrum-v0.1/Makefile b/src/megametrum-v0.1/Makefile index 297d136a..5b20a8a5 100644 --- a/src/megametrum-v0.1/Makefile +++ b/src/megametrum-v0.1/Makefile @@ -12,7 +12,8 @@ INC = \  	ao_pins.h \  	altitude.h \  	ao_kalman.h \ -	ao_product.h +	ao_product.h \ +	ao_ms5607.h  #  # Common AltOS sources @@ -36,7 +37,8 @@ ALTOS_SRC = \  	ao_dma_stm.c \  	ao_spi_stm.c \  	ao_ms5607.c \ -	ao_adc_stm.c +	ao_adc_stm.c \ +	ao_beep_stm.c  PRODUCT=MegaMetrum-v0.1  PRODUCT_DEF=-DMEGAMETRUM diff --git a/src/megametrum-v0.1/ao_megametrum.c b/src/megametrum-v0.1/ao_megametrum.c index 02fe91fe..4d9343e1 100644 --- a/src/megametrum-v0.1/ao_megametrum.c +++ b/src/megametrum-v0.1/ao_megametrum.c @@ -17,6 +17,17 @@  #include "ao.h" +void +beep(void) +{ +	ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(2000)); +} + +const struct ao_cmds ao_mm_cmds[] = { +	{ beep, "b\0Beep" }, +	{ 0, NULL }, +}; +  int  main(void)  { @@ -32,8 +43,10 @@ main(void)  	ao_dma_init();  	ao_spi_init();  	ao_ms5607_init(); +	ao_beep_init();  	ao_adc_init(); +	ao_cmd_register(&ao_mm_cmds[0]);  	ao_start_scheduler();  	return 0;  } diff --git a/src/stm/ao_beep_stm.c b/src/stm/ao_beep_stm.c new file mode 100644 index 00000000..8c0c0ee3 --- /dev/null +++ b/src/stm/ao_beep_stm.c @@ -0,0 +1,130 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "ao.h" + +void +ao_beep(uint8_t beep) +{ +	if (beep == 0) { +		stm_tim3.cr1 = 0; +		stm_rcc.apb1enr &= ~(1 << STM_RCC_APB1ENR_TIM3EN); +	} else { +		stm_rcc.apb1enr |= (1 << STM_RCC_APB1ENR_TIM3EN); + +		stm_tim3.cr1 = ((STM_TIM234_CR1_CKD_1 << STM_TIM234_CR1_CKD) | +				(0 << STM_TIM234_CR1_ARPE) | +				(STM_TIM234_CR1_CMS_EDGE << STM_TIM234_CR1_CMS) | +				(0 << STM_TIM234_CR1_DIR) | +				(0 << STM_TIM234_CR1_OPM) | +				(0 << STM_TIM234_CR1_URS) | +				(0 << STM_TIM234_CR1_UDIS) | +				(0 << STM_TIM234_CR1_CEN)); + +		stm_tim3.cr2 = ((0 << STM_TIM234_CR2_TI1S) | +				(STM_TIM234_CR2_MMS_RESET << STM_TIM234_CR2_MMS) | +				(0 << STM_TIM234_CR2_CCDS)); + +		/* Set prescaler to match cc1111 clocks +		 */ +		stm_tim3.psc = STM_APB1 / 750000; + +		/* 1. Select the counter clock (internal, external, prescaler). +		 * +		 * Setting SMCR to zero means use the internal clock +		 */ + +		stm_tim3.smcr = 0; + +		/* 2. Write the desired data in the TIMx_ARR and TIMx_CCRx registers. */ +		stm_tim3.arr = beep; +		stm_tim3.ccr1 = beep; + +		/* 3. Set the CCxIE and/or CCxDE bits if an interrupt and/or a +		 * DMA request is to be generated. +		 */ +		/* don't want this */ + +		/* 4. Select the output mode. For example, you must write +		 *  OCxM=011, OCxPE=0, CCxP=0 and CCxE=1 to toggle OCx output +		 *  pin when CNT matches CCRx, CCRx preload is not used, OCx +		 *  is enabled and active high. +		 */ + +		stm_tim3.ccmr1 = ((0 << STM_TIM234_CCMR1_OC2CE) | +				  (STM_TIM234_CCMR1_OC2M_FROZEN << STM_TIM234_CCMR1_OC2M) | +				  (0 << STM_TIM234_CCMR1_OC2PE) | +				  (0 << STM_TIM234_CCMR1_OC2FE) | +				  (STM_TIM234_CCMR1_CC2S_OUTPUT << STM_TIM234_CCMR1_CC2S) | + +				  (0 << STM_TIM234_CCMR1_OC1CE) | +				  (STM_TIM234_CCMR1_OC1M_TOGGLE << STM_TIM234_CCMR1_OC1M) | +				  (0 << STM_TIM234_CCMR1_OC1PE) | +				  (0 << STM_TIM234_CCMR1_OC1FE) | +				  (STM_TIM234_CCMR1_CC1S_OUTPUT << STM_TIM234_CCMR1_CC1S)); + + +		stm_tim3.ccer = ((0 << STM_TIM234_CCER_CC4NP) | +				 (0 << STM_TIM234_CCER_CC4P) | +				 (0 << STM_TIM234_CCER_CC4E) | +				 (0 << STM_TIM234_CCER_CC3NP) | +				 (0 << STM_TIM234_CCER_CC3P) | +				 (0 << STM_TIM234_CCER_CC3E) | +				 (0 << STM_TIM234_CCER_CC2NP) | +				 (0 << STM_TIM234_CCER_CC2P) | +				 (0 << STM_TIM234_CCER_CC2E) | +				 (0 << STM_TIM234_CCER_CC1NP) | +				 (0 << STM_TIM234_CCER_CC1P) | +				 (1 << STM_TIM234_CCER_CC1E)); + + +		/* 5. Enable the counter by setting the CEN bit in the TIMx_CR1 register. */ + +		stm_tim3.cr1 = ((STM_TIM234_CR1_CKD_1 << STM_TIM234_CR1_CKD) | +				(0 << STM_TIM234_CR1_ARPE) | +				(STM_TIM234_CR1_CMS_EDGE << STM_TIM234_CR1_CMS) | +				(0 << STM_TIM234_CR1_DIR) | +				(0 << STM_TIM234_CR1_OPM) | +				(0 << STM_TIM234_CR1_URS) | +				(0 << STM_TIM234_CR1_UDIS) | +				(1 << STM_TIM234_CR1_CEN)); +	} +} + +void +ao_beep_for(uint8_t beep, uint16_t ticks) __reentrant +{ +	ao_beep(beep); +	ao_delay(ticks); +	ao_beep(0); +} + +void +ao_beep_init(void) +{ +	/* Our beeper is on PC6, which is hooked to TIM3_CH1, +	 * which is on PC6 +	 */ + +	stm_rcc.ahbenr |= (1 << STM_RCC_AHBENR_GPIOCEN); + +	stm_afr_set(&stm_gpioc, 6, STM_AFR_AF2); + +	/* Leave the timer off until requested */ +	 +	stm_rcc.apb1enr &= ~(1 << STM_RCC_APB1ENR_TIM3EN); +} diff --git a/src/stm/stm32l.h b/src/stm/stm32l.h index 54d95c9a..39dd710d 100644 --- a/src/stm/stm32l.h +++ b/src/stm/stm32l.h @@ -1240,4 +1240,219 @@ extern struct stm_i2c stm_i2c1, stm_i2c2;  #define STM_I2C_CCR_CCR		0  #define  STM_I2C_CCR_MASK	0x7ff +struct stm_tim234 { +	vuint32_t	cr1; +	vuint32_t	cr2; +	vuint32_t	smcr; +	vuint32_t	dier; + +	vuint32_t	sr; +	vuint32_t	egr; +	vuint32_t	ccmr1; +	vuint32_t	ccmr2; + +	vuint32_t	ccer; +	vuint32_t	cnt; +	vuint32_t	psc; +	vuint32_t	arr; + +	uint32_t	reserved_30; +	vuint32_t	ccr1; +	vuint32_t	ccr2; +	vuint32_t	ccr3; + +	vuint32_t	ccr4; +	uint32_t	reserved_44; +	vuint32_t	dcr; +	vuint32_t	dmar; + +	uint32_t	reserved_50; +}; + +extern struct stm_tim234 stm_tim2, stm_tim3, stm_tim4; + +#define STM_TIM234_CR1_CKD	8 +#define  STM_TIM234_CR1_CKD_1		0 +#define  STM_TIM234_CR1_CKD_2		1 +#define  STM_TIM234_CR1_CKD_4		2 +#define  STM_TIM234_CR1_CKD_MASK	3 +#define STM_TIM234_CR1_ARPE	7 +#define STM_TIM234_CR1_CMS	5 +#define  STM_TIM234_CR1_CMS_EDGE	0 +#define  STM_TIM234_CR1_CMS_CENTER_1	1 +#define  STM_TIM234_CR1_CMS_CENTER_2	2 +#define  STM_TIM234_CR1_CMS_CENTER_3	3 +#define  STM_TIM234_CR1_CMS_MASK	3 +#define STM_TIM234_CR1_DIR	4 +#define STM_TIM234_CR1_OPM	3 +#define STM_TIM234_CR1_URS	2 +#define STM_TIM234_CR1_UDIS	1 +#define STM_TIM234_CR1_CEN	0 + +#define STM_TIM234_CR2_TI1S	7 +#define STM_TIM234_CR2_MMS	4 +#define  STM_TIM234_CR2_MMS_RESET		0 +#define  STM_TIM234_CR2_MMS_ENABLE		1 +#define  STM_TIM234_CR2_MMS_UPDATE		2 +#define  STM_TIM234_CR2_MMS_COMPARE_PULSE	3 +#define  STM_TIM234_CR2_MMS_COMPARE_OC1REF	4 +#define  STM_TIM234_CR2_MMS_COMPARE_OC2REF	5 +#define  STM_TIM234_CR2_MMS_COMPARE_OC3REF	6 +#define  STM_TIM234_CR2_MMS_COMPARE_OC4REF	7 +#define  STM_TIM234_CR2_MMS_MASK		7 +#define STM_TIM234_CR2_CCDS	3 + +#define STM_TIM234_SMCR_ETP	15 +#define STM_TIM234_SMCR_ECE	14 +#define STM_TIM234_SMCR_ETPS	12 +#define  STM_TIM234_SMCR_ETPS_OFF		0 +#define  STM_TIM234_SMCR_ETPS_DIV_2	       	1 +#define  STM_TIM234_SMCR_ETPS_DIV_4		2 +#define  STM_TIM234_SMCR_ETPS_DIV_8		3 +#define  STM_TIM234_SMCR_ETPS_MASK		3 +#define STM_TIM234_SMCR_ETF	8 +#define  STM_TIM234_SMCR_ETF_NONE		0 +#define  STM_TIM234_SMCR_ETF_INT_N_2		1 +#define  STM_TIM234_SMCR_ETF_INT_N_4		2 +#define  STM_TIM234_SMCR_ETF_INT_N_8		3 +#define  STM_TIM234_SMCR_ETF_DTS_2_N_6		4 +#define  STM_TIM234_SMCR_ETF_DTS_2_N_8		5 +#define  STM_TIM234_SMCR_ETF_DTS_4_N_6		6 +#define  STM_TIM234_SMCR_ETF_DTS_4_N_8		7 +#define  STM_TIM234_SMCR_ETF_DTS_8_N_6		8 +#define  STM_TIM234_SMCR_ETF_DTS_8_N_8		9 +#define  STM_TIM234_SMCR_ETF_DTS_16_N_5		10 +#define  STM_TIM234_SMCR_ETF_DTS_16_N_6		11 +#define  STM_TIM234_SMCR_ETF_DTS_16_N_8		12 +#define  STM_TIM234_SMCR_ETF_DTS_32_N_5		13 +#define  STM_TIM234_SMCR_ETF_DTS_32_N_6		14 +#define  STM_TIM234_SMCR_ETF_DTS_32_N_8		15 +#define  STM_TIM234_SMCR_ETF_MASK		15 +#define STM_TIM234_SMCR_MSM	7 +#define STM_TIM234_SMCR_TS	4 +#define  STM_TIM234_SMCR_TS_TR0			0 +#define  STM_TIM234_SMCR_TS_TR1			1 +#define  STM_TIM234_SMCR_TS_TR2			2 +#define  STM_TIM234_SMCR_TS_TR3			3 +#define  STM_TIM234_SMCR_TS_TI1F_ED		4 +#define  STM_TIM234_SMCR_TS_TI1FP1		5 +#define  STM_TIM234_SMCR_TS_TI2FP2		6 +#define  STM_TIM234_SMCR_TS_ETRF		7 +#define  STM_TIM234_SMCR_TS_MASK		7 +#define STM_TIM234_SMCR_OCCS	3 +#define STM_TIM234_SMCR_SMS	0 +#define  STM_TIM234_SMCR_SMS_DISABLE		0 +#define  STM_TIM234_SMCR_SMS_ENCODER_MODE_1	1 +#define  STM_TIM234_SMCR_SMS_ENCODER_MODE_2	2 +#define  STM_TIM234_SMCR_SMS_ENCODER_MODE_3	3 +#define  STM_TIM234_SMCR_SMS_RESET_MODE		4 +#define  STM_TIM234_SMCR_SMS_GATED_MODE		5 +#define  STM_TIM234_SMCR_SMS_TRIGGER_MODE	6 +#define  STM_TIM234_SMCR_SMS_EXTERNAL_CLOCK	7 +#define  STM_TIM234_SMCR_SMS_MASK		7 + +#define STM_TIM234_SR_CC4OF	12 +#define STM_TIM234_SR_CC3OF	11 +#define STM_TIM234_SR_CC2OF	10 +#define STM_TIM234_SR_CC1OF	9 +#define STM_TIM234_SR_TIF	6 +#define STM_TIM234_SR_CC4IF	4 +#define STM_TIM234_SR_CC3IF	3 +#define STM_TIM234_SR_CC2IF	2 +#define STM_TIM234_SR_CC1IF	1 +#define STM_TIM234_SR_UIF	0 + +#define STM_TIM234_CCMR1_OC2CE	15 +#define STM_TIM234_CCMR1_OC2M	12 +#define  STM_TIM234_CCMR1_OC2M_FROZEN			0 +#define  STM_TIM234_CCMR1_OC2M_SET_HIGH_ON_MATCH	1 +#define  STM_TIM234_CCMR1_OC2M_SET_LOW_ON_MATCH		2 +#define  STM_TIM234_CCMR1_OC2M_TOGGLE			3 +#define  STM_TIM234_CCMR1_OC2M_FORCE_LOW		4 +#define  STM_TIM234_CCMR1_OC2M_FORCE_HIGH		5 +#define  STM_TIM234_CCMR1_OC2M_PWM_MODE_1		6 +#define  STM_TIM234_CCMR1_OC2M_PWM_MODE_2		7 +#define  STM_TIM234_CCMR1_OC2M_MASK			7 +#define STM_TIM234_CCMR1_OC2PE	11 +#define STM_TIM234_CCMR1_OC2FE	10 +#define STM_TIM234_CCMR1_CC2S	8 +#define  STM_TIM234_CCMR1_CC2S_OUTPUT			0 +#define  STM_TIM234_CCMR1_CC2S_INPUT_TI2		1 +#define  STM_TIM234_CCMR1_CC2S_INPUT_TI1		2 +#define  STM_TIM234_CCMR1_CC2S_INPUT_TRC		3 +#define  STM_TIM234_CCMR1_CC2S_MASK			3 + +#define STM_TIM234_CCMR1_OC1CE	7 +#define STM_TIM234_CCMR1_OC1M	4 +#define  STM_TIM234_CCMR1_OC1M_FROZEN			0 +#define  STM_TIM234_CCMR1_OC1M_SET_HIGH_ON_MATCH	1 +#define  STM_TIM234_CCMR1_OC1M_SET_LOW_ON_MATCH		2 +#define  STM_TIM234_CCMR1_OC1M_TOGGLE			3 +#define  STM_TIM234_CCMR1_OC1M_FORCE_LOW		4 +#define  STM_TIM234_CCMR1_OC1M_FORCE_HIGH		5 +#define  STM_TIM234_CCMR1_OC1M_PWM_MODE_1		6 +#define  STM_TIM234_CCMR1_OC1M_PWM_MODE_2		7 +#define  STM_TIM234_CCMR1_OC1M_MASK			7 +#define STM_TIM234_CCMR1_OC1PE	11 +#define STM_TIM234_CCMR1_OC1FE	2 +#define STM_TIM234_CCMR1_CC1S	0 +#define  STM_TIM234_CCMR1_CC1S_OUTPUT			0 +#define  STM_TIM234_CCMR1_CC1S_INPUT_TI1		1 +#define  STM_TIM234_CCMR1_CC1S_INPUT_TI2		2 +#define  STM_TIM234_CCMR1_CC1S_INPUT_TRC		3 +#define  STM_TIM234_CCMR1_CC1S_MASK			3 + +#define STM_TIM234_CCMR2_OC2CE	15 +#define STM_TIM234_CCMR2_OC4M	12 +#define  STM_TIM234_CCMR2_OC4M_FROZEN			0 +#define  STM_TIM234_CCMR2_OC4M_SET_HIGH_ON_MATCH	1 +#define  STM_TIM234_CCMR2_OC4M_SET_LOW_ON_MATCH		2 +#define  STM_TIM234_CCMR2_OC4M_TOGGLE			3 +#define  STM_TIM234_CCMR2_OC4M_FORCE_LOW		4 +#define  STM_TIM234_CCMR2_OC4M_FORCE_HIGH		5 +#define  STM_TIM234_CCMR2_OC4M_PWM_MODE_1		6 +#define  STM_TIM234_CCMR2_OC4M_PWM_MODE_2		7 +#define  STM_TIM234_CCMR2_OC4M_MASK			7 +#define STM_TIM234_CCMR2_OC4PE	11 +#define STM_TIM234_CCMR2_OC4FE	10 +#define STM_TIM234_CCMR2_CC4S	8 +#define  STM_TIM234_CCMR2_CC4S_OUTPUT			0 +#define  STM_TIM234_CCMR2_CC4S_INPUT_TI4		1 +#define  STM_TIM234_CCMR2_CC4S_INPUT_TI3		2 +#define  STM_TIM234_CCMR2_CC4S_INPUT_TRC		3 +#define  STM_TIM234_CCMR2_CC4S_MASK			3 + +#define STM_TIM234_CCMR2_OC3CE	7 +#define STM_TIM234_CCMR2_OC3M	4 +#define  STM_TIM234_CCMR2_OC3M_FROZEN			0 +#define  STM_TIM234_CCMR2_OC3M_SET_HIGH_ON_MATCH	1 +#define  STM_TIM234_CCMR2_OC3M_SET_LOW_ON_MATCH		2 +#define  STM_TIM234_CCMR2_OC3M_TOGGLE			3 +#define  STM_TIM234_CCMR2_OC3M_FORCE_LOW		4 +#define  STM_TIM234_CCMR2_OC3M_FORCE_HIGH		5 +#define  STM_TIM234_CCMR2_OC3M_PWM_MODE_1		6 +#define  STM_TIM234_CCMR2_OC3M_PWM_MODE_2		7 +#define  STM_TIM234_CCMR2_OC3M_MASK			7 +#define STM_TIM234_CCMR2_OC3PE	11 +#define STM_TIM234_CCMR2_OC3FE	2 +#define STM_TIM234_CCMR2_CC3S	0 +#define  STM_TIM234_CCMR2_CC3S_OUTPUT			0 +#define  STM_TIM234_CCMR2_CC3S_INPUT_TI3		1 +#define  STM_TIM234_CCMR2_CC3S_INPUT_TI4		2 +#define  STM_TIM234_CCMR2_CC3S_INPUT_TRC		3 +#define  STM_TIM234_CCMR2_CC3S_MASK			3 + +#define STM_TIM234_CCER_CC4NP	15 +#define STM_TIM234_CCER_CC4P	13 +#define STM_TIM234_CCER_CC4E	12 +#define STM_TIM234_CCER_CC3NP	11 +#define STM_TIM234_CCER_CC3P	9 +#define STM_TIM234_CCER_CC3E	8 +#define STM_TIM234_CCER_CC2NP	7 +#define STM_TIM234_CCER_CC2P	5 +#define STM_TIM234_CCER_CC2E	4 +#define STM_TIM234_CCER_CC1NP	3 +#define STM_TIM234_CCER_CC1P	1 +#define STM_TIM234_CCER_CC1E	0 +  #endif /* _STM32L_H_ */ | 
