Barcode reader with a TCD1304AP TOSHIBA CCD linear image sensor and NUCLEO-F103RB board.

Dependencies:   mbed zbar

Barcode Reader

Barcodes represent data by varying the widths of spaces and bars. These barcodes, now commonly referred to as linear or one-dimensional (1D), can be scanned by barcode readers. In this project a TCD1304AP TOSHIBA CCD linear image sensor is used to scan barcodes. The obtained light intensity stream is passed to the ZBar library streamlined for embedded use.

Flow charthttps://os.mbed.com/media/uploads/hudakz/barcodereader_diagram.png
TCD1304AP Driver

The TCD1304AP requires three clock signals (see below the Timing chart). It can operate with or without a built-in electronic shutter. In this project the electronic shutter is used to control the integration (exposure) time:

https://os.mbed.com/media/uploads/hudakz/barcodereader_timing.png




I used STM32CubeIDE to build the driver for the TCD1304AP sensor and then merged it with the Mbed OS 2 project.

STM32F103RB clock configuration
https://os.mbed.com/media/uploads/hudakz/barcodereader_clockconf.png


STM32F103RB pinout
https://os.mbed.com/media/uploads/hudakz/barcodereader_pinout.png


  • The signal for TCD1304AP's master clock (fiM) is generated by STM32F103's TIM1 timer and it is output at pin PA_8.
  • The Shift Gate clock signal (SH) is produced by timer TIM2 and it's available at pin PA_15.
  • The Integration Clear Gate pulses (ICG) are generated by timer TIM3 at pin PA_6.

The TCD1304AP's master clock runs at 1.714MHz. Pixel data is available at its output (OS) after each four pulses. To keep up with such speed DMA (Direct Memmory Access) is used to move the voltage data produced by the ADC (Analog to Digital Convertor) into the STM32F103's SRAM. The ADC is clocked with a 12MHz signal and runs in continuous mode.

https://os.mbed.com/media/uploads/hudakz/barcodereader_clocking.png

Committer:
hudakz
Date:
Fri Jan 10 22:10:07 2020 +0000
Revision:
3:f2e67488f5ab
Parent:
0:cd0771c3346e
Barcode reader with a TCD1304AP TOSHIBA CCD linear image sensor and NUCLEO-F103RB board.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:cd0771c3346e 1 /* USER CODE BEGIN Header */
hudakz 0:cd0771c3346e 2 /**
hudakz 0:cd0771c3346e 3 ******************************************************************************
hudakz 0:cd0771c3346e 4 * @file stm32f1xx_it.c
hudakz 0:cd0771c3346e 5 * @brief Interrupt Service Routines.
hudakz 0:cd0771c3346e 6 ******************************************************************************
hudakz 0:cd0771c3346e 7 * @attention
hudakz 0:cd0771c3346e 8 *
hudakz 0:cd0771c3346e 9 * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
hudakz 0:cd0771c3346e 10 * All rights reserved.</center></h2>
hudakz 0:cd0771c3346e 11 *
hudakz 0:cd0771c3346e 12 * This software component is licensed by ST under BSD 3-Clause license,
hudakz 0:cd0771c3346e 13 * the "License"; You may not use this file except in compliance with the
hudakz 0:cd0771c3346e 14 * License. You may obtain a copy of the License at:
hudakz 0:cd0771c3346e 15 * opensource.org/licenses/BSD-3-Clause
hudakz 0:cd0771c3346e 16 *
hudakz 0:cd0771c3346e 17 ******************************************************************************
hudakz 0:cd0771c3346e 18 */
hudakz 0:cd0771c3346e 19 /* USER CODE END Header */
hudakz 0:cd0771c3346e 20
hudakz 0:cd0771c3346e 21 /* Includes ------------------------------------------------------------------*/
hudakz 0:cd0771c3346e 22 #include "main.h"
hudakz 0:cd0771c3346e 23 #include "stm32f1xx_it_mx.h"
hudakz 0:cd0771c3346e 24 /* Private includes ----------------------------------------------------------*/
hudakz 0:cd0771c3346e 25 /* USER CODE BEGIN Includes */
hudakz 0:cd0771c3346e 26 /* USER CODE END Includes */
hudakz 0:cd0771c3346e 27
hudakz 0:cd0771c3346e 28 /* Private typedef -----------------------------------------------------------*/
hudakz 0:cd0771c3346e 29 /* USER CODE BEGIN TD */
hudakz 0:cd0771c3346e 30
hudakz 0:cd0771c3346e 31 /* USER CODE END TD */
hudakz 0:cd0771c3346e 32
hudakz 0:cd0771c3346e 33 /* Private define ------------------------------------------------------------*/
hudakz 0:cd0771c3346e 34 /* USER CODE BEGIN PD */
hudakz 0:cd0771c3346e 35
hudakz 0:cd0771c3346e 36 /* USER CODE END PD */
hudakz 0:cd0771c3346e 37
hudakz 0:cd0771c3346e 38 /* Private macro -------------------------------------------------------------*/
hudakz 0:cd0771c3346e 39 /* USER CODE BEGIN PM */
hudakz 0:cd0771c3346e 40
hudakz 0:cd0771c3346e 41 /* USER CODE END PM */
hudakz 0:cd0771c3346e 42
hudakz 0:cd0771c3346e 43 /* Private variables ---------------------------------------------------------*/
hudakz 0:cd0771c3346e 44 /* USER CODE BEGIN PV */
hudakz 0:cd0771c3346e 45
hudakz 0:cd0771c3346e 46 /* USER CODE END PV */
hudakz 0:cd0771c3346e 47
hudakz 0:cd0771c3346e 48 /* Private function prototypes -----------------------------------------------*/
hudakz 0:cd0771c3346e 49 /* USER CODE BEGIN PFP */
hudakz 0:cd0771c3346e 50
hudakz 0:cd0771c3346e 51 /* USER CODE END PFP */
hudakz 0:cd0771c3346e 52
hudakz 0:cd0771c3346e 53 /* Private user code ---------------------------------------------------------*/
hudakz 0:cd0771c3346e 54 /* USER CODE BEGIN 0 */
hudakz 0:cd0771c3346e 55
hudakz 0:cd0771c3346e 56 /* USER CODE END 0 */
hudakz 0:cd0771c3346e 57
hudakz 0:cd0771c3346e 58 /* External variables --------------------------------------------------------*/
hudakz 0:cd0771c3346e 59 extern DMA_HandleTypeDef hdma_adc1;
hudakz 0:cd0771c3346e 60 extern TIM_HandleTypeDef htim1;
hudakz 0:cd0771c3346e 61 extern TIM_HandleTypeDef htim3;
hudakz 0:cd0771c3346e 62 /* USER CODE BEGIN EV */
hudakz 0:cd0771c3346e 63
hudakz 0:cd0771c3346e 64 /* USER CODE END EV */
hudakz 0:cd0771c3346e 65
hudakz 0:cd0771c3346e 66 /******************************************************************************/
hudakz 0:cd0771c3346e 67 /* Cortex-M3 Processor Interruption and Exception Handlers */
hudakz 0:cd0771c3346e 68 /******************************************************************************/
hudakz 0:cd0771c3346e 69 /**
hudakz 0:cd0771c3346e 70 * @brief This function handles Non maskable interrupt.
hudakz 0:cd0771c3346e 71 */
hudakz 0:cd0771c3346e 72 void NMI_Handler(void)
hudakz 0:cd0771c3346e 73 {
hudakz 0:cd0771c3346e 74 /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
hudakz 0:cd0771c3346e 75
hudakz 0:cd0771c3346e 76 /* USER CODE END NonMaskableInt_IRQn 0 */
hudakz 0:cd0771c3346e 77 /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
hudakz 0:cd0771c3346e 78
hudakz 0:cd0771c3346e 79 /* USER CODE END NonMaskableInt_IRQn 1 */
hudakz 0:cd0771c3346e 80 }
hudakz 0:cd0771c3346e 81
hudakz 0:cd0771c3346e 82 ///**
hudakz 0:cd0771c3346e 83 // * @brief This function handles Hard fault interrupt.
hudakz 0:cd0771c3346e 84 // */
hudakz 0:cd0771c3346e 85 //void HardFault_Handler(void)
hudakz 0:cd0771c3346e 86 //{
hudakz 0:cd0771c3346e 87 // /* USER CODE BEGIN HardFault_IRQn 0 */
hudakz 0:cd0771c3346e 88
hudakz 0:cd0771c3346e 89 // /* USER CODE END HardFault_IRQn 0 */
hudakz 0:cd0771c3346e 90 // while (1)
hudakz 0:cd0771c3346e 91 // {
hudakz 0:cd0771c3346e 92 // /* USER CODE BEGIN W1_HardFault_IRQn 0 */
hudakz 0:cd0771c3346e 93 // /* USER CODE END W1_HardFault_IRQn 0 */
hudakz 0:cd0771c3346e 94 // }
hudakz 0:cd0771c3346e 95 //}
hudakz 0:cd0771c3346e 96
hudakz 0:cd0771c3346e 97 ///**
hudakz 0:cd0771c3346e 98 // * @brief This function handles Memory management fault.
hudakz 0:cd0771c3346e 99 // */
hudakz 0:cd0771c3346e 100 //void MemManage_Handler(void)
hudakz 0:cd0771c3346e 101 //{
hudakz 0:cd0771c3346e 102 // /* USER CODE BEGIN MemoryManagement_IRQn 0 */
hudakz 0:cd0771c3346e 103
hudakz 0:cd0771c3346e 104 // /* USER CODE END MemoryManagement_IRQn 0 */
hudakz 0:cd0771c3346e 105 // while (1)
hudakz 0:cd0771c3346e 106 // {
hudakz 0:cd0771c3346e 107 // /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
hudakz 0:cd0771c3346e 108 // /* USER CODE END W1_MemoryManagement_IRQn 0 */
hudakz 0:cd0771c3346e 109 // }
hudakz 0:cd0771c3346e 110 //}
hudakz 0:cd0771c3346e 111
hudakz 0:cd0771c3346e 112 ///**
hudakz 0:cd0771c3346e 113 // * @brief This function handles Prefetch fault, memory access fault.
hudakz 0:cd0771c3346e 114 // */
hudakz 0:cd0771c3346e 115 //void BusFault_Handler(void)
hudakz 0:cd0771c3346e 116 //{
hudakz 0:cd0771c3346e 117 // /* USER CODE BEGIN BusFault_IRQn 0 */
hudakz 0:cd0771c3346e 118
hudakz 0:cd0771c3346e 119 // /* USER CODE END BusFault_IRQn 0 */
hudakz 0:cd0771c3346e 120 // while (1)
hudakz 0:cd0771c3346e 121 // {
hudakz 0:cd0771c3346e 122 // /* USER CODE BEGIN W1_BusFault_IRQn 0 */
hudakz 0:cd0771c3346e 123 // /* USER CODE END W1_BusFault_IRQn 0 */
hudakz 0:cd0771c3346e 124 // }
hudakz 0:cd0771c3346e 125 //}
hudakz 0:cd0771c3346e 126
hudakz 0:cd0771c3346e 127 ///**
hudakz 0:cd0771c3346e 128 // * @brief This function handles Undefined instruction or illegal state.
hudakz 0:cd0771c3346e 129 // */
hudakz 0:cd0771c3346e 130 //void UsageFault_Handler(void)
hudakz 0:cd0771c3346e 131 //{
hudakz 0:cd0771c3346e 132 // /* USER CODE BEGIN UsageFault_IRQn 0 */
hudakz 0:cd0771c3346e 133
hudakz 0:cd0771c3346e 134 // /* USER CODE END UsageFault_IRQn 0 */
hudakz 0:cd0771c3346e 135 // while (1)
hudakz 0:cd0771c3346e 136 // {
hudakz 0:cd0771c3346e 137 // /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
hudakz 0:cd0771c3346e 138 // /* USER CODE END W1_UsageFault_IRQn 0 */
hudakz 0:cd0771c3346e 139 // }
hudakz 0:cd0771c3346e 140 //}
hudakz 0:cd0771c3346e 141
hudakz 0:cd0771c3346e 142 /**
hudakz 0:cd0771c3346e 143 * @brief This function handles System service call via SWI instruction.
hudakz 0:cd0771c3346e 144 */
hudakz 0:cd0771c3346e 145 void SVC_Handler(void)
hudakz 0:cd0771c3346e 146 {
hudakz 0:cd0771c3346e 147 /* USER CODE BEGIN SVCall_IRQn 0 */
hudakz 0:cd0771c3346e 148
hudakz 0:cd0771c3346e 149 /* USER CODE END SVCall_IRQn 0 */
hudakz 0:cd0771c3346e 150 /* USER CODE BEGIN SVCall_IRQn 1 */
hudakz 0:cd0771c3346e 151
hudakz 0:cd0771c3346e 152 /* USER CODE END SVCall_IRQn 1 */
hudakz 0:cd0771c3346e 153 }
hudakz 0:cd0771c3346e 154
hudakz 0:cd0771c3346e 155 /**
hudakz 0:cd0771c3346e 156 * @brief This function handles Debug monitor.
hudakz 0:cd0771c3346e 157 */
hudakz 0:cd0771c3346e 158 void DebugMon_Handler(void)
hudakz 0:cd0771c3346e 159 {
hudakz 0:cd0771c3346e 160 /* USER CODE BEGIN DebugMonitor_IRQn 0 */
hudakz 0:cd0771c3346e 161
hudakz 0:cd0771c3346e 162 /* USER CODE END DebugMonitor_IRQn 0 */
hudakz 0:cd0771c3346e 163 /* USER CODE BEGIN DebugMonitor_IRQn 1 */
hudakz 0:cd0771c3346e 164
hudakz 0:cd0771c3346e 165 /* USER CODE END DebugMonitor_IRQn 1 */
hudakz 0:cd0771c3346e 166 }
hudakz 0:cd0771c3346e 167
hudakz 0:cd0771c3346e 168 /**
hudakz 0:cd0771c3346e 169 * @brief This function handles Pendable request for system service.
hudakz 0:cd0771c3346e 170 */
hudakz 0:cd0771c3346e 171 void PendSV_Handler(void)
hudakz 0:cd0771c3346e 172 {
hudakz 0:cd0771c3346e 173 /* USER CODE BEGIN PendSV_IRQn 0 */
hudakz 0:cd0771c3346e 174
hudakz 0:cd0771c3346e 175 /* USER CODE END PendSV_IRQn 0 */
hudakz 0:cd0771c3346e 176 /* USER CODE BEGIN PendSV_IRQn 1 */
hudakz 0:cd0771c3346e 177
hudakz 0:cd0771c3346e 178 /* USER CODE END PendSV_IRQn 1 */
hudakz 0:cd0771c3346e 179 }
hudakz 0:cd0771c3346e 180
hudakz 0:cd0771c3346e 181 /**
hudakz 0:cd0771c3346e 182 * @brief This function handles System tick timer.
hudakz 0:cd0771c3346e 183 */
hudakz 0:cd0771c3346e 184 void SysTick_Handler(void)
hudakz 0:cd0771c3346e 185 {
hudakz 0:cd0771c3346e 186 /* USER CODE BEGIN SysTick_IRQn 0 */
hudakz 0:cd0771c3346e 187
hudakz 0:cd0771c3346e 188 /* USER CODE END SysTick_IRQn 0 */
hudakz 0:cd0771c3346e 189 HAL_IncTick();
hudakz 0:cd0771c3346e 190 /* USER CODE BEGIN SysTick_IRQn 1 */
hudakz 0:cd0771c3346e 191
hudakz 0:cd0771c3346e 192 /* USER CODE END SysTick_IRQn 1 */
hudakz 0:cd0771c3346e 193 }
hudakz 0:cd0771c3346e 194
hudakz 0:cd0771c3346e 195 /******************************************************************************/
hudakz 0:cd0771c3346e 196 /* STM32F1xx Peripheral Interrupt Handlers */
hudakz 0:cd0771c3346e 197 /* Add here the Interrupt Handlers for the used peripherals. */
hudakz 0:cd0771c3346e 198 /* For the available peripheral interrupt handler names, */
hudakz 0:cd0771c3346e 199 /* please refer to the startup file (startup_stm32f1xx.s). */
hudakz 0:cd0771c3346e 200 /******************************************************************************/
hudakz 0:cd0771c3346e 201
hudakz 0:cd0771c3346e 202 /**
hudakz 0:cd0771c3346e 203 * @brief This function handles DMA1 channel1 global interrupt.
hudakz 0:cd0771c3346e 204 */
hudakz 0:cd0771c3346e 205 void DMA1_Channel1_IRQHandler(void)
hudakz 0:cd0771c3346e 206 {
hudakz 0:cd0771c3346e 207 /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
hudakz 0:cd0771c3346e 208
hudakz 0:cd0771c3346e 209 /* USER CODE END DMA1_Channel1_IRQn 0 */
hudakz 0:cd0771c3346e 210 HAL_DMA_IRQHandler(&hdma_adc1);
hudakz 0:cd0771c3346e 211 /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
hudakz 0:cd0771c3346e 212
hudakz 0:cd0771c3346e 213 /* USER CODE END DMA1_Channel1_IRQn 1 */
hudakz 0:cd0771c3346e 214 }
hudakz 0:cd0771c3346e 215
hudakz 0:cd0771c3346e 216 /**
hudakz 0:cd0771c3346e 217 * @brief This function handles TIM1 update interrupt.
hudakz 0:cd0771c3346e 218 */
hudakz 0:cd0771c3346e 219 void TIM1_UP_IRQHandler(void)
hudakz 0:cd0771c3346e 220 {
hudakz 0:cd0771c3346e 221 /* USER CODE BEGIN TIM1_UP_IRQn 0 */
hudakz 0:cd0771c3346e 222
hudakz 0:cd0771c3346e 223 /* USER CODE END TIM1_UP_IRQn 0 */
hudakz 0:cd0771c3346e 224 HAL_TIM_IRQHandler(&htim1);
hudakz 0:cd0771c3346e 225 /* USER CODE BEGIN TIM1_UP_IRQn 1 */
hudakz 0:cd0771c3346e 226
hudakz 0:cd0771c3346e 227 /* USER CODE END TIM1_UP_IRQn 1 */
hudakz 0:cd0771c3346e 228 }
hudakz 0:cd0771c3346e 229
hudakz 0:cd0771c3346e 230 /**
hudakz 0:cd0771c3346e 231 * @brief This function handles TIM3 global interrupt.
hudakz 0:cd0771c3346e 232 */
hudakz 0:cd0771c3346e 233 void TIM3_IRQHandler(void)
hudakz 0:cd0771c3346e 234 {
hudakz 0:cd0771c3346e 235 /* USER CODE BEGIN TIM3_IRQn 0 */
hudakz 0:cd0771c3346e 236
hudakz 0:cd0771c3346e 237 /* USER CODE END TIM3_IRQn 0 */
hudakz 0:cd0771c3346e 238 HAL_TIM_IRQHandler(&htim3);
hudakz 0:cd0771c3346e 239 /* USER CODE BEGIN TIM3_IRQn 1 */
hudakz 0:cd0771c3346e 240
hudakz 0:cd0771c3346e 241 /* USER CODE END TIM3_IRQn 1 */
hudakz 0:cd0771c3346e 242 }
hudakz 0:cd0771c3346e 243
hudakz 0:cd0771c3346e 244 /* USER CODE BEGIN 1 */
hudakz 0:cd0771c3346e 245
hudakz 0:cd0771c3346e 246 /* USER CODE END 1 */
hudakz 0:cd0771c3346e 247 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
hudakz 0:cd0771c3346e 248