The terminology differs a bit per person but mainly a firmware engineer programs a controller that controls the hardware. He needs to know the register map and how to setup and control the hardware that the controller has access to. Firmware is aware of the specific registers of the hardware. The software engineer is on a higher layer, not detailed aware of the hardware. The firmware engineer usually makes a HAL, hardware abstraction layer that is used by the software engineer. All above the HAL layer, I would call software. For smaller systems on chip there might not be a HAL. And depending on the person you have slightly different interpretation of firmware versus software. Because it is all code.
Hardware and software advisor for tech startups. ASIC, FPGA, RPi, Arduino, AI, robots, drones, blockchain, Machine learning, vision processing, IoT and 3D printers are my fields of expertise.