kopia lustrzana https://github.com/stlink-org/stlink
				
				
				
			
		
			
				
	
	
		
			243 wiersze
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			243 wiersze
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
| /* base headers */
 | |
| #include "stdint.h"
 | |
| 
 | |
| /* libstm32l_discovery headers */
 | |
| #include "stm32l1xx_gpio.h"
 | |
| #include "stm32l1xx_adc.h"
 | |
| #include "stm32l1xx_dac.h"
 | |
| #include "stm32l1xx_lcd.h"
 | |
| #include "stm32l1xx_rcc.h"
 | |
| #include "stm32l1xx_rtc.h"
 | |
| #include "stm32l1xx_exti.h"
 | |
| #include "stm32l1xx_pwr.h"
 | |
| #include "stm32l1xx_flash.h"
 | |
| #include "stm32l1xx_syscfg.h"
 | |
| #include "stm32l1xx_dbgmcu.h"
 | |
| 
 | |
| /* board specific macros */
 | |
| #include "discover_board.h"
 | |
| 
 | |
| 
 | |
| /* hardware configuration */
 | |
| 
 | |
| #if CONFIG_STM32VL_DISCOVERY
 | |
| 
 | |
| # define GPIOC 0x40011000 /* port C */
 | |
| # define GPIOC_CRH (GPIOC + 0x04) /* port configuration register high */
 | |
| # define GPIOC_ODR (GPIOC + 0x0c) /* port output data register */
 | |
| 
 | |
| # define LED_BLUE (1 << 8) /* port C, pin 8 */
 | |
| # define LED_GREEN (1 << 9) /* port C, pin 9 */
 | |
| 
 | |
| static inline void setup_leds(void)
 | |
| {
 | |
|   *(volatile uint32_t*)GPIOC_CRH = 0x44444411;
 | |
| }
 | |
| 
 | |
| static inline void switch_leds_on(void)
 | |
| {
 | |
|   *(volatile uint32_t*)GPIOC_ODR = LED_BLUE | LED_GREEN;
 | |
| }
 | |
| 
 | |
| static inline void switch_leds_off(void)
 | |
| {
 | |
|   *(volatile uint32_t*)GPIOC_ODR = 0;
 | |
| }
 | |
| 
 | |
| #elif CONFIG_STM32L_DISCOVERY
 | |
| 
 | |
| # define GPIOB_MODER (GPIOB + 0x00) /* port mode register */
 | |
| # define GPIOB_ODR (GPIOB + 0x14) /* port output data register */
 | |
| 
 | |
| # define LED_BLUE (1 << 6) /* port B, pin 6 */
 | |
| # define LED_GREEN (1 << 7) /* port B, pin 7 */
 | |
| 
 | |
| static inline void setup_leds(void)
 | |
| {
 | |
|   /* configure port 6 and 7 as output */
 | |
|   *(volatile uint32_t*)GPIOB_MODER |= (1 << (7 * 2)) | (1 << (6 * 2));
 | |
| }
 | |
| 
 | |
| static inline void switch_leds_on(void)
 | |
| {
 | |
|   GPIO_HIGH(LD_GPIO_PORT, LD_GREEN_GPIO_PIN);	
 | |
|   GPIO_HIGH(LD_GPIO_PORT, LD_BLUE_GPIO_PIN);
 | |
| }
 | |
| 
 | |
| static inline void switch_leds_off(void)
 | |
| {
 | |
|   GPIO_LOW(LD_GPIO_PORT, LD_GREEN_GPIO_PIN);	
 | |
|   GPIO_LOW(LD_GPIO_PORT, LD_BLUE_GPIO_PIN);
 | |
| }
 | |
| 
 | |
| #endif /* otherwise, error */
 | |
| 
 | |
| 
 | |
| #define delay()						\
 | |
| do {							\
 | |
|   volatile unsigned int i;				\
 | |
|   for (i = 0; i < 1000000; ++i)				\
 | |
|     __asm__ __volatile__ ("nop\n\t":::"memory");	\
 | |
| } while (0)
 | |
| 
 | |
| 
 | |
| static void RCC_Configuration(void)
 | |
| {
 | |
|   /* HSI is 16mhz RC clock directly fed to SYSCLK (rm00038, figure 9) */
 | |
| 
 | |
|   /* enable the HSI clock (high speed internal) */
 | |
|   RCC_HSICmd(ENABLE);
 | |
|   
 | |
|   /* wail til HSI ready */
 | |
|   while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
 | |
|   {}
 | |
| 
 | |
|   /* at startup, SYSCLK driven by MSI. set to HSI */
 | |
|   RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
 | |
|   
 | |
|   /* set MSI to 4mhz */
 | |
|   RCC_MSIRangeConfig(RCC_MSIRange_6);
 | |
| 
 | |
|   /* turn HSE off */
 | |
|   RCC_HSEConfig(RCC_HSE_OFF);  
 | |
|   if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET)
 | |
|   {
 | |
|     while (1) ;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| static void RTC_Configuration(void)
 | |
| {
 | |
|   /* Allow access to the RTC */
 | |
|   PWR_RTCAccessCmd(ENABLE);
 | |
| 
 | |
|   /* Reset Backup Domain */
 | |
|   RCC_RTCResetCmd(ENABLE);
 | |
|   RCC_RTCResetCmd(DISABLE);
 | |
| 
 | |
|   /* LSE Enable */
 | |
|   RCC_LSEConfig(RCC_LSE_ON);
 | |
| 
 | |
|   /* Wait till LSE is ready */
 | |
|   while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
 | |
|   {}
 | |
|   
 | |
|   RCC_RTCCLKCmd(ENABLE);
 | |
|    
 | |
|   /* LCD Clock Source Selection */
 | |
|   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
 | |
| 
 | |
| }
 | |
| 
 | |
| static void setup_dac1(void)
 | |
| {
 | |
|   /* see 10.2 notes */
 | |
| 
 | |
|   static GPIO_InitTypeDef GPIO_InitStructure;
 | |
|   static DAC_InitTypeDef DAC_InitStructure;
 | |
| 
 | |
|   /* DAC clock path:
 | |
|      HSI (16mhz) -> SYSCLK -> HCLK(/1) -> PCLK1(/1)
 | |
|    */
 | |
| 
 | |
|   /* set the AHB clock (HCLK) prescaler to 1 */
 | |
|   RCC_HCLKConfig(RCC_SYSCLK_Div1);
 | |
| 
 | |
|   /* set the low speed APB clock (APB1, ie. PCLK1) prescaler to 1 */
 | |
|   RCC_PCLK1Config(RCC_HCLK_Div1);
 | |
| 
 | |
|   /* enable DAC APB1 clock */
 | |
|   /* signal connections: HSI(16mhz) -> SYSCLK -> AHB */
 | |
|   RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
 | |
| 
 | |
|   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; /* GPIO_Pin_5 for channel 2 */
 | |
|   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
 | |
|   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 | |
|   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
 | |
|   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
 | |
|   GPIO_Init(GPIOA, &GPIO_InitStructure);
 | |
| 
 | |
|   DAC_StructInit(&DAC_InitStructure);
 | |
|   DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
 | |
| #if 0 /* triangle waveform generation */
 | |
|   DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;
 | |
|   DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_1;
 | |
| #else
 | |
|   DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
 | |
|   DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
 | |
| #endif
 | |
|   DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
 | |
|   DAC_Init(DAC_Channel_1, &DAC_InitStructure);
 | |
| 
 | |
|   /* enable dac channel */
 | |
|   DAC_Cmd(DAC_Channel_1, ENABLE);
 | |
| }
 | |
| 
 | |
| static inline void set_dac1_mv(unsigned int mv)
 | |
| {
 | |
|   /* mv the millivolts */
 | |
| 
 | |
|   /* vref in millivolts */
 | |
|   /* #define CONFIG_VREF 5000 */
 | |
| #define CONFIG_VREF 3000
 | |
| 
 | |
|   /* resolution in bits */
 | |
| #define CONFIG_DAC_RES 12
 | |
| 
 | |
|   const uint16_t n = (mv * (1 << (CONFIG_DAC_RES - 1))) / CONFIG_VREF;
 | |
|   DAC_SetChannel1Data(DAC_Align_12b_R, n);
 | |
| }
 | |
| 
 | |
| void main(void)
 | |
| {
 | |
|   static RCC_ClocksTypeDef RCC_Clocks;
 | |
|   static GPIO_InitTypeDef GPIO_InitStructure;
 | |
|   static uint16_t dac_value;
 | |
|   static unsigned int led_state = 0;
 | |
| 
 | |
|   /* Configure Clocks for Application need */
 | |
|   RCC_Configuration();
 | |
|   
 | |
|   /* Configure RTC Clocks */
 | |
|   RTC_Configuration();
 | |
| 
 | |
| #if 0
 | |
|   /* Set internal voltage regulator to 1.8v */
 | |
|   PWR_VoltageScalingConfig(PWR_VoltageScaling_Range1);
 | |
|   /* Wait Until the Voltage Regulator is ready */
 | |
|   while (PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET) ;
 | |
| #endif
 | |
| 
 | |
|   /* configure gpios */
 | |
| 
 | |
|   /* Enable GPIOs clock */ 	
 | |
|   RCC_AHBPeriphClockCmd(LD_GPIO_PORT_CLK, ENABLE);
 | |
| 
 | |
|   /* Configure the GPIO_LED pins  LD3 & LD4*/
 | |
|   GPIO_InitStructure.GPIO_Pin = LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN;
 | |
|   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
 | |
|   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 | |
|   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
 | |
|   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
 | |
|   GPIO_Init(LD_GPIO_PORT, &GPIO_InitStructure);
 | |
|   GPIO_LOW(LD_GPIO_PORT, LD_GREEN_GPIO_PIN);	
 | |
|   GPIO_LOW(LD_GPIO_PORT, LD_BLUE_GPIO_PIN);
 | |
| 
 | |
|   setup_dac1();
 | |
| 
 | |
|   dac_value = 0;
 | |
| 
 | |
|   while (1)
 | |
|   {
 | |
|     DAC_SetChannel1Data(DAC_Align_12b_R, dac_value & 0xfff);
 | |
|     dac_value += 0x10;
 | |
| 
 | |
|     if (led_state & 1) switch_leds_on();
 | |
|     else switch_leds_off();
 | |
|     led_state ^= 1;
 | |
| 
 | |
|     delay();
 | |
|   }
 | |
| }
 |