board.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. #include "main.h"
  2. /* private defines */
  3. #define SPI_BUFFER_SIZE (uint16_t)(24)
  4. /* private macros */
  5. #define HT1632C_CS_ON GPIOA->BRR = (1<<15)
  6. #define HT1632C_CS_OFF GPIOA->BSRR = (1<<15)
  7. #define HT1632C_WR_LOW GPIOB->BRR = (1<<3)
  8. #define HT1632C_WR_HGH GPIOB->BSRR = (1<<3)
  9. #define HT1632C_DATA_0 GPIOB->BRR = (1<<5)
  10. #define HT1632C_DATA_1 GPIOB->BSRR = (1<<5)
  11. /* private variables */
  12. static uint8_t display_Buffer[SPI_BUFFER_SIZE] = {0};
  13. /* private typedef */
  14. /* private functions */
  15. static void GPIO_Init(void);
  16. static void I2C1_Init(void);
  17. static void SPI1_Init(void);
  18. //static void TIM1_Init(void);
  19. //static void TIM3_Init(void);
  20. //static void TIM14_Init(void);
  21. //static void TIM16_Init(void);
  22. //static void TIM17_Init(void);
  23. //static void USART1_UART_Init(void);
  24. /* Board perephireal Configuration */
  25. void Board_Init(void)
  26. {
  27. /* At this stage the microcontroller clock setting is already configured,
  28. this is done through SystemInit() function which is called from startup
  29. file (startup_stm32f072xb.s) before to branch to application main.
  30. To reconfigure the default setting of SystemInit() function, refer to
  31. system_stm32f0xx.c file
  32. */
  33. /* Main peripheral clock enable */
  34. RCC->AHBENR |= (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_DMAEN);
  35. RCC->APB1ENR = (RCC_APB1ENR_PWREN | RCC_APB1ENR_I2C1EN); // | RCC_APB1ENR_TIM14EN| RCC_APB1ENR_TIM3EN);
  36. RCC->APB2ENR = (RCC_APB2ENR_SYSCFGEN | RCC_APB2ENR_SPI1EN); // | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_TIM16EN | RCC_APB2ENR_TIM17EN);
  37. /* Peripheral interrupt init*/
  38. /* RCC_IRQn interrupt configuration */
  39. NVIC_SetPriority(RCC_IRQn, 0);
  40. NVIC_EnableIRQ(RCC_IRQn);
  41. /* Initialize all configured peripherals */
  42. HT1632C_CS_OFF;
  43. HT1632C_WR_HGH;
  44. HT1632C_DATA_1;
  45. GPIO_Init();
  46. /* DMA interrupt init */
  47. /* DMA1_Channel2_3_IRQn interrupt configuration */
  48. NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0);
  49. NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
  50. I2C1_Init();
  51. SPI1_Init();
  52. /** Star SPI transfer to shift registers */
  53. /* DMA Destination addr: SPI1 data register. */
  54. DMA1_Channel3->CPAR = (uint32_t)&(SPI1->DR);
  55. /* Enable SPI transfer */
  56. SPI1->CR1 |= SPI_CR1_SPE;
  57. // Flag.SPI_TX_End = 1;
  58. // TIM1_Init();
  59. // TIM3_Init();
  60. // TIM14_Init();
  61. // TIM16_Init();
  62. // TIM17_Init();
  63. // USART1_UART_Init();
  64. }
  65. /* output 'L', 'G', '5' */
  66. void display_test(void) {
  67. // prepare buffer
  68. display_Buffer[0] = 0x7f;
  69. display_Buffer[1] = 0x46;
  70. display_Buffer[2] = 0x16;
  71. display_Buffer[3] = 0x1e;
  72. display_Buffer[4] = 0x16;
  73. display_Buffer[5] = 0x06;
  74. display_Buffer[6] = 0x0f;
  75. display_Buffer[7] = 0x00;
  76. display_Buffer[8] = 0x3c;
  77. display_Buffer[9] = 0x66;
  78. display_Buffer[10] = 0x03;
  79. display_Buffer[11] = 0x03;
  80. display_Buffer[12] = 0x33;
  81. display_Buffer[13] = 0x66;
  82. display_Buffer[14] = 0x7c;
  83. display_Buffer[15] = 0x00;
  84. display_Buffer[16] = 0x3f;
  85. display_Buffer[17] = 0x03;
  86. display_Buffer[18] = 0x1f;
  87. display_Buffer[19] = 0x30;
  88. display_Buffer[20] = 0x30;
  89. display_Buffer[21] = 0x33;
  90. display_Buffer[22] = 0x1e;
  91. display_Buffer[23] = 0x00;
  92. HT1632C_Write_Data(display_Buffer, 0x0, SPI_BUFFER_SIZE);
  93. tdelay_ms(5000);
  94. HT1632C_Write_Buffer();
  95. tdelay_ms(5000);
  96. int i;
  97. for (i=0; i<16; i++) {
  98. HT1632C_PWM(15-i);
  99. tdelay_ms(1000);
  100. }
  101. tdelay_ms(2000);
  102. for (i=0; i<16; i++) {
  103. HT1632C_PWM(i);
  104. tdelay_ms(1000);
  105. }
  106. }
  107. /**
  108. * @brief GPIO Initialization Function
  109. * @param None
  110. * @retval None
  111. */
  112. static void GPIO_Init(void)
  113. {
  114. /* EXTI Line: falling, pull-up, input */
  115. SYSCFG->EXTICR[3] = 0;
  116. /* Enable IT on provided Lines */
  117. EXTI->IMR |= EXTI_IMR_IM12;
  118. /* Enable Falling Trigger on provided Lines */
  119. EXTI->FTSR |= EXTI_IMR_IM12;
  120. /* EXTI interrupt init*/
  121. NVIC_SetPriority(EXTI4_15_IRQn, 0);
  122. NVIC_EnableIRQ(EXTI4_15_IRQn);
  123. /* Select output mode (01) PP+PU, High Speed
  124. PA8 - Buzzer (AF2 for TIM1_CH1)
  125. PA15 - ~CS / SPI_NSS (AF0)
  126. * Select output mode (10) AF+PP, High Speed
  127. PB3 - ~WR / SPI_SCK (AF0)
  128. PB5 - Data / SPI_MOSI (AF0)
  129. * Select output mode (10) AF+OD, High Speed
  130. PB6 - SCL (AF1)
  131. PB7 - SDA (AF1)
  132. */
  133. // MODE Output
  134. GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER8 | GPIO_MODER_MODER15)) \
  135. | (GPIO_MODER_MODER8_0 | GPIO_MODER_MODER15_0);
  136. GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER3|GPIO_MODER_MODER5)) \
  137. | (GPIO_MODER_MODER3_1|GPIO_MODER_MODER5_1);
  138. // Pull-Up
  139. GPIOA->PUPDR = (GPIOA->PUPDR & ~(GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR15)) \
  140. | (GPIO_PUPDR_PUPDR8_0 | GPIO_PUPDR_PUPDR15_0);
  141. // High Speed
  142. GPIOA->OSPEEDR = (GPIO_OSPEEDR_OSPEEDR8|GPIO_OSPEEDR_OSPEEDR15);
  143. GPIOB->OSPEEDR = (GPIO_OSPEEDR_OSPEEDR3|GPIO_OSPEEDR_OSPEEDR5 \
  144. |GPIO_OSPEEDR_OSPEEDR6|GPIO_OSPEEDR_OSPEEDR7);
  145. // Open Drain
  146. GPIOB->OTYPER = (GPIO_OTYPER_OT_6|GPIO_OTYPER_OT_7);
  147. // AF1 for PB6 & PB7
  148. GPIOB->AFR[0] = (0x1<<24) | (0x1<<28);
  149. /* Select Pull-Up for input pins
  150. PA0 - BTN1 / H+
  151. PA1 - BTN2 / M+
  152. PA2 - SW1 / Stop
  153. PA3 - SW2 / Sec
  154. PA4 - BTN3 / Res
  155. PA5 - SW3 / AlarmSet
  156. PA6 - SW5 / AlarmOff
  157. PA7 - SW4 / Bright
  158. PA12 - RTC IRQ / Exti
  159. */
  160. GPIOA->PUPDR |= (GPIO_PUPDR_PUPDR0_0|GPIO_PUPDR_PUPDR1_0|GPIO_PUPDR_PUPDR2_0 \
  161. |GPIO_PUPDR_PUPDR3_0|GPIO_PUPDR_PUPDR4_0|GPIO_PUPDR_PUPDR5_0 \
  162. |GPIO_PUPDR_PUPDR6_0|GPIO_PUPDR_PUPDR7_0|GPIO_PUPDR_PUPDR12_0);
  163. }
  164. /**
  165. * @brief I2C1 Initialization Function
  166. * @param None
  167. * @retval None
  168. */
  169. static void I2C1_Init(void)
  170. {
  171. /* I2C1 interrupt Init */
  172. NVIC_SetPriority(I2C1_IRQn, 0);
  173. NVIC_EnableIRQ(I2C1_IRQn);
  174. /** I2C Initialization: I2C_Fast */
  175. I2C1->CR1 = 0x0;
  176. I2C1->CR2 = 0x0;
  177. I2C1->TIMINGR = 0x2010091A; // 0x00901850 ?
  178. I2C1->CR1 = I2C_CR1_PE;
  179. I2C1->CR2 = I2C_CR2_AUTOEND;
  180. }
  181. /**
  182. * @brief SPI1 Initialization Function
  183. * @param None
  184. * @retval None
  185. */
  186. static void SPI1_Init(void)
  187. {
  188. /* SPI1 DMA Init */
  189. /* SPI1_TX Init: Priority high, Memory increment, read from memory, non-circular mode,
  190. Enable DMA transfer complete/error interrupts */
  191. DMA1_Channel3->CCR = (DMA_CCR_PL_1 | DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_CIRC | DMA_CCR_TCIE); // | DMA_CCR_TEIE
  192. /* SPI1 interrupt Init */
  193. NVIC_SetPriority(SPI1_IRQn, 0);
  194. NVIC_EnableIRQ(SPI1_IRQn);
  195. /* SPI1 parameter configuration: master mode, data 8 bit, divider = 2, TX DMA */
  196. SPI1->CR1 = (SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_CPOL | SPI_CR1_CPHA | SPI_CR1_LSBFIRST);
  197. SPI1->CR2 = (SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 | SPI_CR2_TXDMAEN);
  198. }
  199. /**
  200. * @brief Initialization HT1632C
  201. */
  202. void HT1632C_Init(void) {
  203. // GPIO pin mode
  204. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  205. GPIOB->MODER |= (GPIO_MODER_MODER3_0 | GPIO_MODER_MODER5_0);
  206. //HT1632C_Write_Cmd(0x802, 0x800);
  207. //HT1632C_Write_Cmd(0x806, 0x800);
  208. HT1632C_CS_ON;
  209. HT1632C_Write_bits(0x802, 0x800); // Turn on system oscillator
  210. HT1632C_Write_bits(0x6, 0x100); // Turn on LED duty cycle generator
  211. HT1632C_CS_OFF;
  212. // SPI pin mode
  213. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  214. GPIOB->MODER |= (GPIO_MODER_MODER3_1 | GPIO_MODER_MODER5_1);
  215. }
  216. /**
  217. * @brief Set HT1632C PWM Value
  218. * @param pwm value in 0-15
  219. */
  220. void HT1632C_PWM(uint8_t pwm) {
  221. // check value
  222. if (pwm > 15) {
  223. pwm = 15;
  224. }
  225. // align value
  226. pwm <<= 1;
  227. // GPIO pin mode
  228. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  229. GPIOB->MODER |= (GPIO_MODER_MODER3_0 | GPIO_MODER_MODER5_0);
  230. HT1632C_CS_ON;
  231. HT1632C_Write_bits((0x940|pwm), 0x800);
  232. HT1632C_CS_OFF;
  233. // SPI pin mode
  234. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  235. GPIOB->MODER |= (GPIO_MODER_MODER3_1 | GPIO_MODER_MODER5_1);
  236. }
  237. /**
  238. * @brief Set HT1632C Blink state
  239. * @param state 0 for off, any other value for on
  240. */
  241. void HT1632C_BlinkState(uint8_t state) {
  242. // GPIO pin mode
  243. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  244. GPIOB->MODER |= (GPIO_MODER_MODER3_0 | GPIO_MODER_MODER5_0);
  245. HT1632C_CS_ON;
  246. if (state == 0) {
  247. HT1632C_Write_bits(0x810, 0x800); // Blink off
  248. } else {
  249. HT1632C_Write_bits(0x812, 0x800); // Blink on
  250. }
  251. HT1632C_CS_OFF;
  252. // SPI pin mode
  253. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  254. GPIOB->MODER |= (GPIO_MODER_MODER3_1 | GPIO_MODER_MODER5_1);
  255. }
  256. /**
  257. * @brief Set HT1632C Led state
  258. * @param state 0 for off, any other value for on
  259. */
  260. void HT1632C_LedState(uint8_t state) {
  261. // GPIO pin mode
  262. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  263. GPIOB->MODER |= (GPIO_MODER_MODER3_0 | GPIO_MODER_MODER5_0);
  264. HT1632C_CS_ON;
  265. if (state == 0) {
  266. HT1632C_Write_bits(0x804, 0x800); // Led off
  267. } else {
  268. HT1632C_Write_bits(0x806, 0x800); // Led on
  269. }
  270. HT1632C_CS_OFF;
  271. // SPI pin mode
  272. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  273. GPIOB->MODER |= (GPIO_MODER_MODER3_1 | GPIO_MODER_MODER5_1);
  274. }
  275. /**
  276. * @brief Write <nbits> bit of data to selected HT1632Cs
  277. * @param data words to write, nbits of bits (1<<(num-1))
  278. */
  279. void HT1632C_Write_bits(const uint16_t data, uint16_t nbits) {
  280. do {
  281. HT1632C_WR_LOW;
  282. if (data & nbits) {
  283. HT1632C_DATA_1;
  284. } else {
  285. HT1632C_DATA_0;
  286. }
  287. // _delay_half_us();
  288. HT1632C_WR_HGH;
  289. // _delay_half_us();
  290. } while (nbits >>= 1);
  291. }
  292. /**
  293. * @brief Write CMD to selected HT1632Cs
  294. * @param data words to write
  295. * @param nbits cmd len in bits (1<<(num-1))
  296. */
  297. void HT1632C_Write_Cmd(const uint16_t data, uint16_t nbits) {
  298. }
  299. /**
  300. * @brief Write Data to HT1632C
  301. * @param data pointer to data array
  302. * @param addr begin address
  303. * @param len bytes to write
  304. */
  305. void HT1632C_Write_Data(const uint8_t * data, const uint8_t addr, const uint8_t len) {
  306. uint16_t a = 0x280 | (addr & 0x7f);
  307. /* DMA Source addr: Address of the SPI buffer. */
  308. DMA1_Channel3->CMAR = (uint32_t)&data[0];
  309. /* Set DMA data transfer length (SPI buffer length). */
  310. DMA1_Channel3->CNDTR = len;
  311. // GPIO pin mode
  312. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  313. GPIOB->MODER |= (GPIO_MODER_MODER3_0 | GPIO_MODER_MODER5_0);
  314. HT1632C_CS_ON;
  315. HT1632C_Write_bits(a, 0x200);
  316. // SPI pin mode
  317. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  318. GPIOB->MODER |= (GPIO_MODER_MODER3_1 | GPIO_MODER_MODER5_1);
  319. // start transfer
  320. SPI1->CR2 |= (SPI_CR2_TXDMAEN);
  321. DMA1_Channel3->CCR |= DMA_CCR_EN;
  322. // End of transaction in DMA1_Channel2_3_IRQHandler()
  323. }
  324. /**
  325. * @brief Write all buffer to HT1632C
  326. */
  327. void HT1632C_Write_Buffer(void) {
  328. static uint8_t spi_buf[SPI_BUFFER_SIZE] = {0};
  329. /* DMA Source addr: Address of the SPI buffer. */
  330. DMA1_Channel3->CMAR = (uint32_t)&spi_buf;
  331. /* Set DMA data transfer length (SPI buffer length). */
  332. DMA1_Channel3->CNDTR = SPI_BUFFER_SIZE;
  333. /* Rotate display buffer */
  334. uint8_t i, j, p = 0x01;
  335. for (i=0; i<8; i++) {
  336. if ((display_Buffer[0] & p) != 0) { spi_buf[i] |= 0x01; }
  337. if ((display_Buffer[1] & p) != 0) { spi_buf[i] |= 0x02; }
  338. if ((display_Buffer[2] & p) != 0) { spi_buf[i] |= 0x04; }
  339. if ((display_Buffer[3] & p) != 0) { spi_buf[i] |= 0x08; }
  340. if ((display_Buffer[4] & p) != 0) { spi_buf[i] |= 0x10; }
  341. if ((display_Buffer[5] & p) != 0) { spi_buf[i] |= 0x20; }
  342. if ((display_Buffer[6] & p) != 0) { spi_buf[i] |= 0x40; }
  343. if ((display_Buffer[7] & p) != 0) { spi_buf[i] |= 0x80; }
  344. j = i + 8;
  345. if ((display_Buffer[8] & p) != 0) { spi_buf[j] |= 0x01; }
  346. if ((display_Buffer[9] & p) != 0) { spi_buf[j] |= 0x02; }
  347. if ((display_Buffer[10] & p) != 0) { spi_buf[i] |= 0x04; }
  348. if ((display_Buffer[11] & p) != 0) { spi_buf[i] |= 0x08; }
  349. if ((display_Buffer[12] & p) != 0) { spi_buf[j] |= 0x10; }
  350. if ((display_Buffer[13] & p) != 0) { spi_buf[j] |= 0x20; }
  351. if ((display_Buffer[14] & p) != 0) { spi_buf[j] |= 0x40; }
  352. if ((display_Buffer[15] & p) != 0) { spi_buf[j] |= 0x80; }
  353. j = i + 16;
  354. if ((display_Buffer[16] & p) != 0) { spi_buf[j] |= 0x01; }
  355. if ((display_Buffer[17] & p) != 0) { spi_buf[j] |= 0x02; }
  356. if ((display_Buffer[18] & p) != 0) { spi_buf[j] |= 0x04; }
  357. if ((display_Buffer[19] & p) != 0) { spi_buf[j] |= 0x08; }
  358. if ((display_Buffer[20] & p) != 0) { spi_buf[j] |= 0x10; }
  359. if ((display_Buffer[21] & p) != 0) { spi_buf[j] |= 0x20; }
  360. if ((display_Buffer[22] & p) != 0) { spi_buf[j] |= 0x40; }
  361. if ((display_Buffer[23] & p) != 0) { spi_buf[j] |= 0x80; }
  362. p <<= 1;
  363. }
  364. /* Toggle pins to GPIO mode */
  365. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  366. GPIOB->MODER |= (GPIO_MODER_MODER3_0 | GPIO_MODER_MODER5_0);
  367. HT1632C_CS_ON;
  368. HT1632C_Write_bits(0x280, 0x200);
  369. /* Toggle pins to SPI mode */
  370. GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER5);
  371. GPIOB->MODER |= (GPIO_MODER_MODER3_1 | GPIO_MODER_MODER5_1);
  372. /* start transfer */
  373. SPI1->CR2 |= (SPI_CR2_TXDMAEN);
  374. DMA1_Channel3->CCR |= DMA_CCR_EN;
  375. /* End of transaction in DMA1_Channel2_3_IRQHandler() */
  376. }
  377. /**
  378. * @brief This function handles EXTI line 4 to 15 interrupts.
  379. */
  380. void EXTI4_15_IRQHandler(void)
  381. {
  382. if ((EXTI->PR & EXTI_IMR_IM12) != 0)
  383. {
  384. EXTI->PR = EXTI_IMR_IM12;
  385. Flag.RTC_IRQ = 1;
  386. //ES_PlaceEvent(evNewSecond);
  387. }
  388. }
  389. /**
  390. * @brief This function handles DMA1 channel 2 and 3 interrupts.
  391. */
  392. void DMA1_Channel2_3_IRQHandler(void) {
  393. if ((DMA1->ISR & DMA_ISR_TCIF3) != 0) {
  394. // clear interrupt flag
  395. DMA1->IFCR = DMA_IFCR_CTCIF3;
  396. // disable transfer
  397. DMA1_Channel3->CCR &= ~(DMA_CCR_EN);
  398. // wite for spi
  399. while ((SPI1->SR & SPI_SR_BSY) != 0) { __NOP(); };
  400. // deselect chip
  401. HT1632C_CS_OFF;
  402. }
  403. }