5. POS秤分享与总结
本次通过TOPWAY7寸智能屏,设计了一个POS秤,本次试用活动过程还是写了不少的代码,在本帖子里面将其开源,共享。液晶屏仅为数据显示,而数据的控制与采集全部来自AT32单片机,下面是编写的一些驱动。
//**************************************************************** //****** SPI GPIO 初始化函数 //****** 输入参数: 无 //****** 返回值: 无 //**************************************************************** void PhySpiGpioInit() { gpio_init_type gpio_initstructure; crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE); // CS PA4 gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_initstructure.gpio_pull = GPIO_PULL_UP; gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT; gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_initstructure.gpio_pins = GPIO_PINS_4; gpio_init(GPIOA, &gpio_initstructure); gpio_bits_set(GPIOA, GPIO_PINS_4); // FLASH_CS_HIGH // SCK PA5 gpio_initstructure.gpio_pull = GPIO_PULL_UP; gpio_initstructure.gpio_mode = GPIO_MODE_MUX; gpio_initstructure.gpio_pins = GPIO_PINS_5; gpio_init(GPIOA, &gpio_initstructure); // MISO PA6 gpio_initstructure.gpio_pull = GPIO_PULL_UP; gpio_initstructure.gpio_mode = GPIO_MODE_MUX; gpio_initstructure.gpio_pins = GPIO_PINS_6; gpio_init(GPIOA, &gpio_initstructure); // MOSI PA7 gpio_initstructure.gpio_pull = GPIO_PULL_UP; gpio_initstructure.gpio_mode = GPIO_MODE_MUX; gpio_initstructure.gpio_pins = GPIO_PINS_7; gpio_init(GPIOA, &gpio_initstructure); } //**************************************************************** //****** SPI 参数配置初始化函数 //****** 输入参数: 无 //****** 返回值: 无 //**************************************************************** void PhySpiCoreInit() { spi_init_type spi_init_struct; crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE); spi_default_para_init(&spi_init_struct); spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX; spi_init_struct.master_slave_mode = SPI_MODE_MASTER; //主机 spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_8; // spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB; spi_init_struct.frame_bit_num = SPI_FRAME_8BIT; spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH; spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE; spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE; spi_init(SPI1, &spi_init_struct); spi_enable(SPI1, TRUE); } //**************************************************************** //****** SPI 初始化函数 //****** 输入参数: 无 //****** 返回值: 无 //**************************************************************** void PhySpiInit() { PhySpiGpioInit(); PhySpiCoreInit(); } //**************************************************************** //****** SPI 发送和接收一个字节数据 函数 //****** 输入参数: uint32_t erase_addr 块擦除所在的地址 //****** 返回值: uint8_t 接收的数据 //**************************************************************** uint8_t PhySpiByteWrite(uint8_t data) { uint8_t brxbuff; spi_i2s_dma_transmitter_enable(SPI1, FALSE); spi_i2s_dma_receiver_enable(SPI1, FALSE); spi_i2s_data_transmit(SPI1, data); while(spi_i2s_flag_get(SPI1, SPI_I2S_RDBF_FLAG) == RESET); brxbuff = spi_i2s_data_receive(SPI1); while(spi_i2s_flag_get(SPI1, SPI_I2S_BF_FLAG) != RESET); return brxbuff; } //**************************************************************** //****** 串口GPIO初始化函数 //****** 输入参数: 无 //****** 返回值: 无 //**************************************************************** static void PhyUartGpioInit() { gpio_init_type gpio_init_struct; crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE); gpio_default_para_init(&gpio_init_struct); gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_mode = GPIO_MODE_MUX; gpio_init_struct.gpio_pins = GPIO_PINS_9|GPIO_PINS_10; gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init(GPIOA, &gpio_init_struct); gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_1); gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_1); } //**************************************************************** //****** 串口参数初始化函数 //****** 输入参数: uint32_t baudrate 波特率 //****** 返回值: 无 //**************************************************************** static void PhyUartCoreInit(uint32_t baudrate) { crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE); usart_init(USART1, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT); usart_parity_selection_config(USART1, USART_PARITY_NONE); usart_transmitter_enable(USART1, TRUE); usart_receiver_enable(USART1, TRUE); usart_dma_receiver_enable(USART1, TRUE); nvic_irq_enable(USART1_IRQn, 0, 0); usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE); usart_enable(USART1, TRUE); } //**************************************************************** //****** 串口DMA参数初始化函数 //****** 输入参数: 无 //****** 返回值: 无 //**************************************************************** void PhyUartDmaInit() { dma_init_type dma_init_struct; crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE); dma_reset(DMA1_CHANNEL3); dma_default_para_init(&dma_init_struct); dma_init_struct.buffer_size = USART_RX_BUFFER_SIZE; dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY; dma_init_struct.memory_base_addr = (uint32_t)UartRxBuffer; dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE; dma_init_struct.memory_inc_enable = TRUE; dma_init_struct.peripheral_base_addr = (uint32_t)&USART1->dt; dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE; dma_init_struct.peripheral_inc_enable = FALSE; dma_init_struct.priority = DMA_PRIORITY_MEDIUM; dma_init_struct.loop_mode_enable = FALSE; dma_init(DMA1_CHANNEL3, &dma_init_struct); dma_channel_enable(DMA1_CHANNEL3, TRUE); } //**************************************************************** //****** 串口初始化函数 //****** 输入参数: 无 //****** 返回值: 无 //**************************************************************** void PhyUartInit() { PhyUartGpioInit(); PhyUartDmaInit(); PhyUartCoreInit(115200); } //**************************************************************** //****** 串口发送双字节函数 //****** 输入参数: uint16_t DataByte :发送双字节 //****** 返回值: 无 //**************************************************************** void PhyUartSendByte(uint8_t Byte) { USART1->dt_bit.dt = Byte; while(USART1->sts_bit.tdc == RESET); } //**************************************************************** //****** 串口中断处理函数 //****** 输入参数: 无 //****** 返回值: 无 //**************************************************************** void USART1_IRQHandler() { uint16_t rc_len; if(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET) { usart_data_receive(USART1); dma_channel_enable(DMA1_CHANNEL3,FALSE); rc_len = USART_RX_BUFFER_SIZE - dma_data_number_get(DMA1_CHANNEL3); dma_data_number_set(DMA1_CHANNEL3, USART_RX_BUFFER_SIZE); dma_channel_enable(DMA1_CHANNEL3,TRUE); if((UartRxBuffer[1]==0x99) && (rc_len == 8)) //处理升级帧 { JumpToBoot(); } } } 部分QT 代码 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); ForeachPort(); current_date_time =QDateTime::currentDateTime(); current_date =current_date_time.toString("yyyy.MM.dd hh:mm:ss ddd"); connect(timer0, SIGNAL(timeout()), this, SLOT(Time0out())); timer0->start(1000); this->setWindowTitle("智能Pos秤 " + current_date); } MainWindow::~MainWindow() { delete ui; } //自动获取有效的串口号 void MainWindow::ForeachPort() { //使用foreach获取有效的串口信息 ui->comboBox_Port->clear(); foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { //这里相当于自动识别串口号之后添加到了cmb,如果要手动选择可以用下面列表的方式添加进去 Serial.setPort(info); ui->comboBox_Port->addItem(info.portName()); } } //刷新走时 void MainWindow::Time0out() { current_date_time =QDateTime::currentDateTime(); current_date =current_date_time.toString("yyyy.MM.dd hh:mm:ss ddd"); this->setWindowTitle("智能Pos秤 " + current_date); } void MainWindow::on_pushButton_clicked() { if(ui->pushButton->text() == "连接设备") { Serial.setPortName(ui->comboBox_Port->currentText()); if(Serial.open(QIODevice::ReadWrite) == false) { QMessageBox::warning(this,"警告","打开失败,请检查对应的端口号!"); return; } ui->pushButton->setText("断开设备"); } else if(ui->pushButton->text() == "断开设备") { ui->pushButton->setText("连接设备"); Serial.clear(); Serial.close(); } } void MainWindow::on_toolButton_clicked() { quint8 sendData[11]; sendData[0] = 0xAA; //设备ID sendData[1] = 0x42; //命令码 sendData[2] = 0x00; //数据 sendData[3] = 0x00; sendData[4] = 0x00; sendData[5] = 0x80; sendData[6] = 0x31; sendData[7] = 0x00; sendData[8] = 0xCC; sendData[9] = 0x33; sendData[10] = 0xC3; sendData[11] = 0x3C; Serial.write((char *)sendData,11); }