Skip to content

Commit

Permalink
Use PWM for contrast control on PB9
Browse files Browse the repository at this point in the history
  • Loading branch information
EarToEarOak committed Sep 7, 2015
1 parent e152f42 commit f1c6da3
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 54 deletions.
86 changes: 58 additions & 28 deletions STM32F407VGTx.ioc
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,47 @@
File.Version=5
KeepUserPlacement=true
Mcu.Family=STM32F4
Mcu.IP0=DAC
Mcu.IP1=NVIC
Mcu.IP2=RCC
Mcu.IP3=TIM7
Mcu.IP0=NVIC
Mcu.IP1=RCC
Mcu.IP2=TIM7
Mcu.IP3=TIM11
Mcu.IP4=TIM12
Mcu.IPNb=5
Mcu.Name=STM32F407V(E-G)Tx
Mcu.Package=LQFP100
Mcu.Pin0=PH0-OSC_IN
Mcu.Pin1=PH1-OSC_OUT
Mcu.Pin10=PB15
Mcu.Pin10=PB9
Mcu.Pin11=VP_TIM7_VS_ClockSourceINT
Mcu.Pin2=PA5
Mcu.Pin3=PE7
Mcu.Pin4=PE8
Mcu.Pin5=PE9
Mcu.Pin6=PE10
Mcu.Pin7=PE11
Mcu.Pin8=PE12
Mcu.Pin9=PE13
Mcu.PinsNb=12
Mcu.Pin12=VP_TIM11_VS_ClockSourceINT
Mcu.Pin2=PE7
Mcu.Pin3=PE8
Mcu.Pin4=PE9
Mcu.Pin5=PE10
Mcu.Pin6=PE11
Mcu.Pin7=PE12
Mcu.Pin8=PE13
Mcu.Pin9=PB15
Mcu.PinsNb=13
Mcu.UserConstants=
Mcu.UserName=STM32F407VGTx
MxCube.Version=4.9.0
MxDb.Version=DB.4.0.90
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_0
NVIC.SysTick_IRQn=true\:0\:0\:false
PA5.GPIOParameters=GPIO_Label
PA5.GPIO_Label=LCD_VO
PA5.Locked=true
PA5.Signal=COMP_DAC2_group
PB15.GPIOParameters=GPIO_Label
NVIC.TIM7_IRQn=true\:0\:6\:false
PB15.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd,GPIO_Label
PB15.GPIO_Label=LCD_K
PB15.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PB15.GPIO_PuPd=GPIO_NOPULL
PB15.GPIO_Speed=GPIO_SPEED_LOW
PB15.Signal=S_TIM12_CH2
PB9.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd,GPIO_Label
PB9.GPIO_Label=LCD_VO
PB9.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PB9.GPIO_PuPd=GPIO_NOPULL
PB9.GPIO_Speed=GPIO_SPEED_MEDIUM
PB9.Signal=S_TIM11_CH1
PCC.Checker=false
PCC.Line=STM32F407/417
PCC.MCU=STM32F407V(E-G)Tx
Expand All @@ -45,32 +52,53 @@ PCC.Seq0=0
PCC.Series=STM32F4
PCC.Temperature=25
PCC.Vdd=3.3
PE10.GPIOParameters=GPIO_Label
PE10.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PE10.GPIO_Label=LCD_DB4
PE10.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PE10.GPIO_PuPd=GPIO_NOPULL
PE10.GPIO_Speed=GPIO_SPEED_LOW
PE10.Locked=true
PE10.Signal=GPIO_Output
PE11.GPIOParameters=GPIO_Label
PE11.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PE11.GPIO_Label=LCD_DB5
PE11.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PE11.GPIO_PuPd=GPIO_NOPULL
PE11.GPIO_Speed=GPIO_SPEED_LOW
PE11.Locked=true
PE11.Signal=GPIO_Output
PE12.GPIOParameters=GPIO_Label
PE12.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PE12.GPIO_Label=LCD_DB6
PE12.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PE12.GPIO_PuPd=GPIO_NOPULL
PE12.GPIO_Speed=GPIO_SPEED_LOW
PE12.Locked=true
PE12.Signal=GPIO_Output
PE13.GPIOParameters=GPIO_Label
PE13.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PE13.GPIO_Label=LCD_DB7
PE13.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PE13.GPIO_PuPd=GPIO_NOPULL
PE13.GPIO_Speed=GPIO_SPEED_LOW
PE13.Locked=true
PE13.Signal=GPIO_Output
PE7.GPIOParameters=GPIO_Label
PE7.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PE7.GPIO_Label=LCD_RS
PE7.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PE7.GPIO_PuPd=GPIO_NOPULL
PE7.GPIO_Speed=GPIO_SPEED_LOW
PE7.Locked=true
PE7.Signal=GPIO_Output
PE8.GPIOParameters=GPIO_Label
PE8.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PE8.GPIO_Label=LCD_RW
PE8.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PE8.GPIO_PuPd=GPIO_NOPULL
PE8.GPIO_Speed=GPIO_SPEED_LOW
PE8.Locked=true
PE8.Signal=GPIO_Output
PE9.GPIOParameters=GPIO_Label
PE9.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PE9.GPIO_Label=LCD_E
PE9.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PE9.GPIO_PuPd=GPIO_NOPULL
PE9.GPIO_Speed=GPIO_SPEED_LOW
PE9.Locked=true
PE9.Signal=GPIO_Output
PH0-OSC_IN.Mode=HSE-External-Oscillator
Expand Down Expand Up @@ -110,12 +138,14 @@ RCC.VCOI2SOutputFreq_Value=192000000
RCC.VCOInputFreq_Value=1000000
RCC.VCOOutputFreq_Value=336000000
RCC.VcooutputI2S=96000000
SH.COMP_DAC2_group.0=DAC_OUT2,DAC_OUT2
SH.COMP_DAC2_group.ConfNb=1
SH.S_TIM11_CH1.0=TIM11_CH1,PWM Generation1 CH1
SH.S_TIM11_CH1.ConfNb=1
SH.S_TIM12_CH2.0=TIM12_CH2,PWM Generation2 CH2
SH.S_TIM12_CH2.ConfNb=1
TIM12.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM12.IPParameters=Channel-PWM Generation2 CH2
VP_TIM11_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT
VP_TIM7_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM7_VS_ClockSourceINT.Signal=TIM7_VS_ClockSourceINT
board=STM32F4DISCOVERY
Expand Down
73 changes: 47 additions & 26 deletions src/hd44780/hd44780.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,24 +28,31 @@
#include "hd44780.h"
#include "stm32f4xx.h"

#define BKL_FREQ 125000
#define CON_FREQ 250000

#define HD44780_TIMER TIM7
#define HD44780_PRIORITY 6

#define BKL_TIMER TIM12
#define BKL_CHANNEL TIM_CHANNEL_2

#define BKL_TIME 1000
#define BKL_FREQ 125000
#define BKL_PERIOD (SystemCoreClock / 2) / BKL_FREQ

#define BKL_GPIO GPIOB
#define BKL_PIN GPIO_PIN_15
#define BKL_AF GPIO_AF9_TIM12

#define CON_CHANNEL DAC_CHANNEL_2
#define CON_GPIO_EN __GPIOB_CLK_ENABLE
#define CON_GPIO GPIOB
#define CON_PIN GPIO_PIN_9
#define CON_AF GPIO_AF3_TIM11
#define CON_TIMER TIM11
#define CON_CHANNEL TIM_CHANNEL_1
#define CON_CLK_EN __TIM11_CLK_ENABLE
#define CON_PERIOD HAL_RCC_GetHCLKFreq() / CON_FREQ

#define CON_GPIO GPIOA
#define CON_PIN GPIO_PIN_5

#define MAX_CONTRAST 3000

Expand Down Expand Up @@ -93,8 +100,8 @@ typedef struct {
} hd44780_conf_t;

static TIM_HandleTypeDef TIM_Handle_Lcd;
TIM_HandleTypeDef TIM_Handle_Brigt;
DAC_HandleTypeDef DAC_Handle_Cont;
static TIM_HandleTypeDef TIM_Handle_Brigt;
static TIM_HandleTypeDef Handle_Con;

static hd44780_conf_t Lcd_Conf;
static volatile hd44780_task_t Queue[HD44780_QUEUE_SIZE];
Expand Down Expand Up @@ -269,10 +276,12 @@ void hd44780_brightness(const uint8_t brightness) {
*/
void hd44780_contrast(const uint8_t contrast) {

uint16_t cont;
uint32_t cont;

cont = ((uint32_t) (100 - contrast) * MAX_CONTRAST) / 100;
HAL_DAC_SetValue(&DAC_Handle_Cont, CON_CHANNEL, DAC_ALIGN_12B_R, cont);
cont = (uint32_t) (100 - contrast);
cont *= BKL_PERIOD * 2;
cont /= 100;
__HAL_TIM_SetCompare(&Handle_Con, CON_CHANNEL, cont);
}

/**
Expand Down Expand Up @@ -542,23 +551,35 @@ void hd44780_init_brightness(void) {
*/
void hd44780_init_contrast(void) {

GPIO_InitTypeDef GPIO_InitStructure;
DAC_ChannelConfTypeDef DAC_ChannelConf;

__GPIOA_CLK_ENABLE();
GPIO_InitStructure.Pin = CON_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(CON_GPIO, &GPIO_InitStructure);

__DAC_CLK_ENABLE();
DAC_Handle_Cont.Instance = DAC;
HAL_DAC_Init(&DAC_Handle_Cont);

DAC_ChannelConf.DAC_Trigger = DAC_TRIGGER_NONE;
DAC_ChannelConf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
HAL_DAC_ConfigChannel(&DAC_Handle_Cont, &DAC_ChannelConf, CON_CHANNEL);
HAL_DAC_Start(&DAC_Handle_Cont, CON_CHANNEL);
GPIO_InitTypeDef gpio;
TIM_OC_InitTypeDef oc;

CON_GPIO_EN();
gpio.Pin = CON_PIN;
gpio.Mode = GPIO_MODE_AF_OD;
gpio.Pull = GPIO_PULLDOWN;
gpio.Speed = GPIO_SPEED_MEDIUM;
gpio.Alternate = CON_AF;
HAL_GPIO_Init(CON_GPIO, &gpio);

CON_CLK_EN();
Handle_Con.Instance = CON_TIMER;
Handle_Con.Init.Period = CON_PERIOD;
Handle_Con.Init.Prescaler = 1 - 1;
Handle_Con.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
Handle_Con.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&Handle_Con);

oc.OCMode = TIM_OCMODE_PWM1;
oc.OCIdleState = TIM_OCIDLESTATE_SET;
oc.OCNIdleState = TIM_OCNIDLESTATE_RESET;
oc.Pulse = 0;
oc.OCPolarity = TIM_OCPOLARITY_HIGH;
oc.OCNPolarity = TIM_OCNPOLARITY_HIGH;

HAL_TIM_PWM_ConfigChannel(&Handle_Con, &oc,
CON_CHANNEL);
HAL_TIM_PWM_Start(&Handle_Con, CON_CHANNEL);
}

void TIM7_IRQHandler(void) {
Expand Down

0 comments on commit f1c6da3

Please sign in to comment.